一、高精度加法
基本
HRBUST1550
1 #include<stdio.h> 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 using namespace std; 6 int a[110]; 7 int b[110]; 8 int main(void){ 9 int n; 10 scanf("%d",&n); 11 for(int l=0;l<n;l++){ 12 string s1; 13 string s2; 14 cin>>s1;//********************************* 15 cin>>s2;// char数组初始化读入 16 memset(a,0,sizeof(a));//int数组归0化读入 17 memset(b,0,sizeof(b));//******************* 18 a[0]=s1.length();//长度 19 b[0]=s2.length();//长度 20 for(int i=1;i<=a[0];i++)//**************** 21 a[i]=s1[a[0]-i]-'0';//倒叙存入数组 22 for(int i=1;i<=b[0];i++;23 b[i]=s2[b[0]-i]-'0';//**************** 24 int k=a[0]>=b[0]?a[0]:b[0];//求出和的预测位数 25 for(int i=1;i<=k;i++){//****************** 26 a[i+1]+=(a[i]+b[i])/10; 27 a[i]=(a[i]+b[i])%10;//核心计算 28 }//*************************************** 29 if(a[k+1]!=0) 30 k++; 31 for(int j=k;j>0;j--) 32 cout<<a[j]; 33 cout<<endl; 34 } 35 }
变种(20进制)
HRBUST1624
1 #include<cstring> 2 #include<iostream> 3 #include<stdio.h> 4 int a[210]; 5 int b[210]; 6 using namespace std; 7 int main(void){ 8 string s1; 9 string s2; 10 while(cin>>s1){ 11 cin>>s2; 12 memset(a,0,sizeof(a)); 13 memset(b,0,sizeof(b)); 14 int nla=0; 15 while(s1[nla]=='A') 16 nla++; 17 int nlb=0; 18 while(s2[nlb]=='A') 19 nlb++; 20 a[0]=s1.length()-nla; 21 b[0]=s2.length()-nlb; 22 for(int i=1;i<=s1.length();i++) 23 a[i]=s1[s1.length()-i]-'A'; 24 for(int i=1;i<=s2.length();i++) 25 b[i]=s2[s2.length()-i]-'A'; 26 int k=a[0]>=b[0]?a[0]:b[0]; 27 for(int i=1;i<=k;i++){ 28 a[i+1]+=(a[i]+b[i])/20; 29 a[i]=(a[i]+b[i])%20; 30 } 31 if(a[k+1] !=0) 32 k++; 33 for(int j=k;j>0;j--) 34 printf("%c",a[j]+'A'); 35 cout<<endl; 36 } 37 }
应用1-大斐波数
HDU1715
1 #include<stdio.h> 2 #include<cstring> 3 using namespace std; 4 int a[2000]; 5 int b[2000]; 6 int c[2000]; 7 void addfun(int x[],int y[],int z[]); 8 int main(void){ 9 int n; 10 scanf("%d",&n); 11 for(int t=0;t<n;t++){ 12 int k; 13 scanf("%d",&k); 14 if(k==1||k==2){ 15 printf("1 "); 16 continue; 17 } 18 else{ 19 memset(a,0,sizeof(a)); 20 memset(b,0,sizeof(b)); 21 memset(c,0,sizeof(c)); 22 b[0]=b[1]=c[0]=c[1]=1; 23 int tim=1; 24 for(int s=3;s<=k;s++){ 25 if(tim==1) 26 addfun(b,c,a); 27 else if(tim==2) 28 addfun(a,b,c); 29 else 30 addfun(c,a,b); 31 tim++; 32 if(tim == 4) 33 tim=1; 34 } 35 if(tim==2){ 36 for(int ll=a[0];ll>0;ll--) 37 printf("%d",a[ll]); 38 printf(" "); 39 } 40 else if(tim==3){ 41 for(int ll=c[0];ll>0;ll--) 42 printf("%d",c[ll]); 43 printf(" "); 44 } 45 else{ 46 for(int ll=b[0];ll>0;ll--) 47 printf("%d",b[ll]); 48 printf(" "); 49 } 50 } 51 } 52 } 53 void addfun(int x[],int y[],int z[]){ 54 memset(z,0,sizeof(z)); 55 z[0]=x[0]>=y[0]?x[0]:y[0]; 56 for(int i=1;i<=z[0];i++){ 57 y[i+1]+=(x[i]+y[i])/10; 58 z[i]=(x[i]+y[i])%10; 59 } 60 if(y[z[0]+1] != 0){ 61 z[0]++; 62 z[z[0]]=y[z[0]]; 63 } 64 }
计算时进位应参加下一位的运算,在原数列中保存结果时直接加到下一位,而在新数列中保存结果时易忽略这一点,所以应该把进位加进下一位加数之中。
HDU1715需要保留一个加数,所以把进位加进准备要牺牲的那个数列中(即f(n-2))。
二、高精度乘法(高精度与高精度)
1 #include<stdio.h> 2 #include<iostream> 3 #include<cstring> 4 int a[1005]; 5 int b[1005]; 6 int c[2010]; 7 using namespace std; 8 int main(void){ 9 string s1; 10 string s2; 11 while(cin>>s1){ 12 cin>>s2; 13 if(s1[0]=='0' || s2[0]=='0'){ 14 cout<<0<<endl; 15 continue; 16 } 17 memset(a,0,sizeof(a)); 18 memset(b,0,sizeof(b)); 19 memset(c,0,sizeof(c)); 20 int la=s1.length(); 21 int lb=s2.length(); 22 for(int i=0;i<la;i++) 23 a[i]=s1[la-i-1]-'0'; 24 for(int i=0;i<lb;i++) 25 b[i]=s2[lb-i-1]-'0'; 26 int lc=la+lb; 27 for(int i=0;i<la;i++){ 28 for(int j=0;j<lb;j++){ 29 c[i+j]+=a[i]*b[j]; 30 c[i+j+1]+=c[i+j]/10; 31 c[i+j]=c[i+j]%10; 32 } 33 } 34 35 if(c[lc-1]==0) 36 lc--; 37 for(int ll=lc-1;ll>=0;ll--) 38 cout<<c[ll]; 39 40 cout<<endl; 41 } 42 }