高精度加法/减法/乘法/除法
P1601 A+B Problem(高精)
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=505; 4 int a[N],b[N],c[N]; 5 void get(string &s,int *p) 6 { 7 int n=s.size(); 8 for(int i=1;i<=n;i++) 9 p[i]=s[n-i]^48; 10 } 11 int main() 12 { 13 string s1,s2; 14 cin>>s1>>s2; 15 get(s1,a); 16 get(s2,b); 17 int n1=s1.size(),n2=s2.size(),len=max(n1,n2),i; 18 for(i=1;i<=len;i++) 19 { 20 c[i]+=a[i]+b[i];//不能向a[i]进位避免最后一位进到没统计; 21 if(c[i]>9) 22 { 23 c[i+1]++; 24 c[i]%=10; 25 } 26 } 27 if(!c[i])i--; 28 for(;i>=1;i--) 29 printf("%d",c[i]); 30 return 0; 31 }
P2142 高精度减法
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e4+100; 4 int a[N],b[N],c[N]; 5 void get(string &s,int *p) 6 { 7 int n=s.size(); 8 for(int i=1;i<=n;i++) 9 p[i]=s[n-i]^48; 10 } 11 int main() 12 { 13 string s1,s2; 14 cin>>s1>>s2; 15 if(s1.size()<s2.size()||(s1.size()==s2.size()&&s1<s2)) 16 { 17 swap(s1,s2); 18 cout<<"-"; 19 } 20 get(s1,a); 21 get(s2,b); 22 int n1=s1.size(),n2=s2.size(),len=max(n1,n2),i; 23 for(i=1;i<=len;i++) 24 { 25 if(a[i]<b[i]) 26 { 27 a[i]+=10; 28 a[i+1]--;//减法不存在进位,所以不用怕最后一位进位; 29 } 30 c[i]=a[i]-b[i]; 31 } 32 i=len; 33 while(i>1&&!c[i])i--; 34 for(;i>=1;i--)printf("%d",c[i]); 35 return 0; 36 }
P1303 A*B Problem
1 #include<bits/stdc++.h> 2 using namespace std; 3 //n*m最多n+m位最少n+m-1; 4 /* 5 123456 6 789 7 123456 8 123456 9 ... 10 123456 加法原理n+m-1,如果最高位有进位则m+n; 11 */ 12 const int N=1e4+5; 13 int a[N],b[N],c[N],x; 14 void get(string &s,int*p) 15 { 16 int n=s.size(); 17 for(int i=1;i<=n;i++) 18 p[i]=s[n-i]^48; 19 } 20 int main() 21 { 22 string s1,s2; 23 cin>>s1>>s2; 24 get(s1,a); 25 get(s2,b); 26 int n1=s1.size(),n2=s2.size(); 27 for(int i=1;i<=n1;i++) 28 { 29 x=0; 30 for(int j=1;j<=n2;j++) 31 { 32 c[i+j-1]+=a[i]*b[j]+x;//当前位数 33 x=c[i+j-1]/10;//进位 34 c[i+j-1]%=10; 35 } 36 c[i+n2]+=x;//进位; 37 } 38 int i=n1+n2; 39 if(x)c[i]=x; 40 while(i>1&&!c[i])i--; 41 for(;i>=1;i--)printf("%d",c[i]); 42 return 0; 43 }
P1480 A/B Problem
这道是高精度除低精度
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=5e3+5; 4 long long a[N],c[N],b,x;//这题数据x要开成longlong 5 int main() 6 { 7 string s; 8 cin>>s>>b; 9 int n=s.size(); 10 for(int i=1;i<=n;i++) 11 a[i]=s[i-1]^48; 12 13 for(int i=1;i<=n;i++) 14 { 15 c[i]=(x*10+a[i])/b; 16 x=(x*10+a[i])%b; 17 } 18 int j=1; 19 20 while(j<n&&!c[j])j++; 21 for(;j<=n;j++)printf("%d",c[j]); 22 return 0; 23 }
P1480 A/B Problem
用高精度/高精度的方法去做, 获取商和余数方法都有
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=5e3+5; 4 int a[N],b[N],c[N]; 5 void get(string &s,int *p) 6 { 7 int n=s.size(); 8 p[0]=n; 9 for(int i=1;i<=n;i++) 10 p[i]=s[n-i]^48; 11 } 12 int compare(int num1[],int num2[]) 13 { 14 if(num1[0]>num2[0])return 1; 15 if(num1[0]<num2[0])return -1; 16 if(num1[0]==num2[0]) 17 { 18 for(int i=num1[0];i>=1;i--) 19 { 20 if(num1[i]>num2[i])return 1; 21 if(num1[i]<num2[i])return -1; 22 } 23 } 24 return 0; 25 } 26 void jian(int a[],int b[]) 27 { 28 int flg,i; 29 flg=compare(a,b);//用减法模拟除法 30 if(flg==0){a[0]=0;return;}//如果减法过程中相等了,说明能原数组a是能整除b的,余数为0;假设有a=123b,则减的过程是100b,20b,10b 3b 2b 1b即a==b; 31 if(flg==1) 32 { 33 for(i=1;i<=a[0];i++) 34 { 35 if(a[i]<b[i]) 36 { 37 a[i]+=10; 38 a[i+1]--; 39 } 40 a[i]-=b[i]; 41 } 42 while(a[0]>0&&a[a[0]]==0)a[0]--; 43 } 44 } 45 void numcpy(int a[],int b[],int dep)//把a复制到b从dep位开始复制; 46 { 47 for(int i=1;i<=a[0];i++)//复制数组,为移位做准备 48 b[dep+i-1]=a[i]; 49 b[0]=a[0]+dep-1; 50 } 51 void work(int a[],int b[],int c[]) 52 { 53 int i,tmp[N]; 54 c[0]=a[0]-b[0]+1;//移位操作n-m+1因为要考虑位数相等的情况 55 for(int i=c[0];i>=1;i--) 56 { 57 memset(tmp,0,sizeof(tmp)); 58 numcpy(b,tmp,i);//开始移位加快算法; 59 while(compare(a,tmp)>=0){c[i]++;jian(a,tmp);}/对每一位最多循环9次; 60 } 61 while(c[0]>0&&c[c[0]]==0)c[0]--;//处理前导0; 62 } 63 int main() 64 { 65 string s1,s2; 66 cin>>s1>>s2; 67 get(s1,a); 68 get(s2,b); 69 work(a,b,c); 70 if(c[0]==0)cout<<"0"<<endl; 71 for(int i=c[0];i>=1;i--) 72 printf("%d",c[i]); 73 //printf("%d",a[i])余数 ,特判a[0]==0余数为0; 74 return 0; 75 }

浙公网安备 33010602011771号