非负大整数乘法和加法
1 #include <cstring> 2 #include <cstdio> 3 #include <iostream> 4 #include <cmath> 5 using namespace std; 6 char anum[1100],bnum[1100],ans[1100]; 7 int cs,i,j,len,t; 8 void swap(char &a,char &b){ 9 char temp=a;a=b;b=temp; 10 } 11 ///非负大整数乘法,时间复杂度为(2*len)^2,空间复杂度为2*len 12 void mxmult(char *num1,char *num2,char *tans) 13 { 14 int len1=strlen(num1); 15 int len2=strlen(num2); 16 int mx=max(len1,len2);mx*=2;///初始化num1把它的长度变为2倍 17 for(i=0,j=len1-1; i<j; i++,j--) swap(num1[i],num1[j]); 18 for(i=0;i<len1; i++) num1[i]-='0'; 19 for(i=len1; i<mx; i++) num1[i]=0; 20 21 len2=strlen(num2);///初始化num2把它的长度变为2倍 22 for(i=0,j=len2-1; i<j; i++,j--) swap(num2[i],num2[j]); 23 for(i=0;i<len2;i++) num2[i]-='0'; 24 for(i=len2; i<mx; i++) num2[i]=0; 25 26 len=mx; 27 for(i=0;i<len;i++)///求乘积 28 { 29 for(j=0;j<=i;j++) 30 { 31 t+=num2[j]*num1[i-j]; 32 } 33 tans[i]=t%10+'0'; 34 t/=10; 35 } 36 i--; 37 while(tans[i]=='0') i--;///处理前导零 38 if(i<0) {tans[0]='0';i=0;} 39 tans[i+1]='\0'; 40 for(j=0;j<i;j++,i--) swap(tans[i],tans[j]); 41 } 42 int main() 43 { 44 while(~scanf("%s%s",anum,bnum)) 45 { 46 mxmult(anum,bnum,ans); 47 printf("%s\n",ans); 48 } 49 return 0; 50 }
乘法:
View Code
1 void bigMulti(const char *a,const char *b,char *c) 2 { 3 int lna=strlen(a); 4 int lnb=strlen(b); 5 int lnc=lna+lnb; 6 if((lna==1&&a[0]=='0')||(lnb==1&&b[0]=='0')){ 7 c[0]='0';c[1]=0; 8 return; 9 } 10 for(int i=0;i<=lnc;i++) c[i]=0; 11 for(int i=lna-1;i>=0;i--) 12 { 13 for(int j=lnb-1;j>=0;j--) 14 { 15 int tmp=(a[i]-'0')*(b[j]-'0')+c[lna+lnb-i-j-2]; 16 c[lna+lnb-i-j-1]+=tmp/10; 17 c[lna+lnb-i-j-2]=tmp%10; 18 } 19 } 20 while(c[lnc]==0) lnc--; 21 for(int i=0;i<=lnc;i++) c[i]+='0'; 22 for(int i=0,j=lnc;i<j;i++,j--) 23 swap(c[i],c[j]); 24 }
1 #include <cstring> 2 #include <cstdio> 3 #include <iostream> 4 #include <cmath> 5 using namespace std; 6 const int Ni = 1000; 7 char anum[Ni],bnum[Ni],ans[2*Ni]; 8 int cs,i,j,len; 9 void swap(char &a,char &b){ 10 char temp=a;a=b;b=temp; 11 } 12 ///非负大整数乘法,时间复杂度为(len)^2,空间复杂度为2*len 13 void mxmult(char *num1,char *num2,char *tans) 14 { 15 int len1=strlen(num1),len2=strlen(num2),t=0; 16 len=2*max(len2,len1); 17 for(i=0;i<=len;i++) tans[i]=0; 18 for(i=0,j=len1-1; i<j; i++,j--) swap(num1[i],num1[j]); 19 for(i=0,j=len2-1; i<j; i++,j--) swap(num2[i],num2[j]); 20 for(i=0;i<len1;i++)///求乘积 21 { 22 for(j=0;j<len2;j++) 23 { 24 t+=(num2[j]-'0')*(num1[i]-'0'); 25 tans[j+i]+=t%10; 26 t/=10; 27 } 28 while(j>=len2&&t) 29 { 30 tans[i+j]+=t%10; 31 t/=10;j++; 32 } 33 } 34 i=len; 35 while(tans[i]==0) i--;///处理前导零 36 len=i; 37 if(i<0) {tans[0]='0';tans[1]='\0';return;} 38 tans[i+1]='\0'; 39 short c=0; 40 for(j=0;j<=len||c;j++) 41 { 42 t=tans[j]; 43 tans[j]=(tans[j]+c)%10; 44 c=(t+c)/10; 45 } 46 for(j=0;j<=len;j++) tans[j]+='0'; 47 for(j=0;j<i;j++,i--) swap(tans[i],tans[j]); 48 } 49 int main() 50 { 51 while(~scanf("%s%s",anum,bnum)) 52 { 53 mxmult(anum,bnum,ans); 54 printf("%s\n",ans); 55 } 56 return 0; 57 }
乘法:
1 #include <cstring> 2 #include <iostream> 3 using namespace std; 4 const int Ni = 1010; 5 char a[Ni],b[Ni],ans[Ni]; 6 void mult(char *a,char *b) 7 { 8 int i,j,la,lb; 9 la=strlen(a);lb=strlen(b); 10 for(i=0,j=la-1;i<j;i++,j--) 11 swap(a[i],a[j]); 12 for(i=0,j=lb-1;i<j;i++,j--) 13 swap(b[i],b[j]); 14 memset(ans,0,sizeof(ans)); 15 for(i=0;i<la;i++){ 16 for(j=0;j<lb;j++) 17 { 18 ans[i+j]+=(a[i]-'0')*(b[j]-'0'); 19 ans[i+j+1]+=ans[i+j]/10; 20 ans[i+j]%=10; 21 } 22 ans[i+j+1]+=ans[i+j]/10; 23 ans[i+j]%=10; 24 } 25 int len=la+lb; 26 for(i=0;i<=len;i++) 27 ans[i]+='0'; 28 while(ans[len]=='0') len--; 29 if(len==-1) len=0; 30 ans[++len]=0; 31 for(i=0,j=len-1;i<j;i++,j--) 32 swap(ans[i],ans[j]); 33 } 34 int main() 35 { 36 while(cin>>a>>b) 37 { 38 mult(a,b); 39 cout<<ans<<endl; 40 } 41 return 0; 42 }
加法:
1 #include <cstring> 2 #include <algorithm> 3 #include <iostream> 4 #include <cstdio> 5 using namespace std; 6 const int Ni = 100000; 7 char a[Ni],b[Ni],ans[Ni]; 8 void add(char *a,char *b) 9 { 10 int la,lb,i,j; 11 la=strlen(a);lb=strlen(b); 12 for(i=0,j=la-1;i<j;i++,j--) 13 swap(a[i],a[j]); 14 for(i=0,j=lb-1;i<j;i++,j--) 15 swap(b[i],b[j]); 16 if(la<lb){ 17 for(i=0;i<la;i++) 18 ans[i]=a[i]+b[i]-'0'-'0'; 19 for(;i<lb;i++) 20 ans[i]=b[i]-'0'; 21 } 22 else 23 { 24 for(i=0;i<lb;i++) 25 ans[i]=a[i]+b[i]-'0'-'0'; 26 for(;i<la;i++) 27 ans[i]=a[i]-'0'; 28 } 29 int tmp,c=0; 30 int len=max(la,lb); 31 ans[len]='\0'; 32 for(i=0;i<=len;i++) 33 { 34 tmp=(ans[i]+c)/10; 35 ans[i]=(ans[i]+c)%10+'0'; 36 c=tmp; 37 } 38 while(ans[len]=='0') len--; 39 ans[++len]='\0'; 40 for(i=0,j=len-1;i<j;i++,j--) 41 swap(ans[i],ans[j]); 42 } 43 int main() 44 { 45 while(cin>>a>>b) 46 { 47 add(a,b); 48 cout<<ans<<endl; 49 } 50 return 0; 51 }