非负大整数乘法和加法

 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 }
原文地址:https://www.cnblogs.com/qijinbiao/p/2653265.html