非负大整数乘法和加法

 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 }

 

你可能感兴趣的:(非负大整数乘法和加法)