zoukankan      html  css  js  c++  java
  • 非负大整数乘法和加法

     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 }
  • 相关阅读:
    Spring学习-- AOP入门动态代理
    Spring学习--泛型依赖注入
    Spring学习--通过注解配置 Bean (三)
    Spring学习--通过注解配置 Bean (二)
    Spring学习--通过注解配置 Bean (一)
    十 字符串处理
    九 Shell中的数组
    八使用Shell函数
    七 循环结构
    六、流程控制语句
  • 原文地址:https://www.cnblogs.com/qijinbiao/p/2653265.html
Copyright © 2011-2022 走看看