大数的四则运算

来源:互联网 发布:安卓java编辑器汉化版 编辑:程序博客网 时间:2024/04/29 19:42

1. 加法

输入采用字符数组保存,然后将输入存在整形数组里,然后逐位相加即可,同时注意进位处理。

[cpp] view plain copy
  1. #include <stdio.h>  
  2. #include <string.h>  
  3.   
  4. int main()  
  5. {  
  6.     char m[555],n[555];  
  7.     int i,len_m,len_n,len_max,k;  
  8.     int a[555]={0},b[555]={0},c[555]={0};  
  9.     scanf("%s",m);  
  10.     len_m =strlen(m);  
  11.     for(i=0;i<=len_m -1;i++)  
  12.         a[i]=m[len_m -1 -i]-'0';  
  13.     scanf("%s",n);  
  14.     len_n=strlen(n);  
  15.     for(i=0;i<=len_n -1;i++)  
  16.         b[i]=n[len_n -1 -i]-'0';  
  17.     if(len_m>len_n)  
  18.         len_max=len_m;  
  19.     else  
  20.         len_max=len_n;  
  21.     k=0;  
  22.     for(i=0;i<=len_max -1;i++)  
  23.     {  
  24.         c[i]=(a[i]+b[i]+k)%10;  
  25.         k=(a[i]+b[i]+k)/10;  
  26.     }  
  27.     if(k!=0)    c[len_max]=1;  
  28.     if(c[len_max]==1)   printf("1");  
  29.     for(i=len_max -1;i>=0;i--)  
  30.         printf("%d",c[i]);  
  31.     return 0;  
  32. }  


2. 减法

原理同加法一样(不确定两个数的大小关系)

比较两数大小:先比较长度,再按位比较(按位比较没写)

[cpp] view plain copy
  1. #include <stdio.h>  
  2. #include <string.h>  
  3.   
  4. int main()  
  5. {  
  6.     char m[555],n[555];  
  7.     int i,len_m,len_n;  
  8.     int a[555]={0},b[555]={0};  
  9.     scanf("%s",m);  
  10.     len_m =strlen(m);  
  11.     for(i=0;i<=len_m -1;i++)  
  12.         a[i]=m[len_m -1 -i]-'0';  
  13.     scanf("%s",n);  
  14.     len_n=strlen(n);  
  15.     for(i=0;i<=len_n -1;i++)  
  16.         b[i]=n[len_n -1 -i]-'0';  
  17.     if(len_m < len_n)      
  18.     {   
  19.         printf("-");  
  20.         for(i=0;i<len_n;i++)  
  21.         {  
  22.             b[i]-=a[i];  
  23.             if(b[i]<0)  
  24.             {  
  25.                 b[i]+=10;  
  26.                 b[i+1]--;  
  27.             }  
  28.         }  
  29.         i=len_n-1;  
  30.         while(b[i]==0)  i--;   
  31.         for(;i>=0;i--)  
  32.             printf("%d",b[i]);  
  33.     }  
  34.     else  
  35.     {  
  36.         for(i=0;i<len_m;i++)  
  37.         {  
  38.             a[i]-=b[i];  
  39.             if(a[i]<0)  
  40.             {  
  41.                 a[i]+=10;  
  42.                 a[i+1]--;  
  43.             }  
  44.         }  
  45.         i=len_m-1;  
  46.         while(a[i]==0)  i--;   
  47.         for(;i>=0;i--)  
  48.             printf("%d",a[i]);  
  49.     }  
  50.     return 0;  
  51. }  


3. 乘法

 原理上也是采用数组模拟。

 a[i]123

 b[j]  12

 用c[k]来保存每次的运算结果,k=i+j;

 c[i+j]=c[i+j]+a[i]*b[j];

 这里来模拟一次乘法过程:

             123

        *     12

       -------------

              246   

        +    123

       -------------

             1476

[cpp] view plain copy
  1. #include <stdio.h>  
  2. #include <string.h>  
  3.   
  4. int main()  
  5. {  
  6.     char m[555],n[555],temp[555];  
  7.     int i,j,len_m,len_n;  
  8.     int a[555]={0},b[555]={0},c[1111]={0};  
  9.     scanf("%s",m);  
  10.     scanf("%s",n);  
  11.     if(strlen(m)<strlen(n))  
  12.     {  
  13.         strcpy(temp,m);  
  14.         strcpy(m,n);  
  15.         strcpy(n,temp);  
  16.     }  
  17.     len_m =strlen(m);  
  18.     for(i=0;i<=len_m -1;i++)  
  19.         a[i]=m[len_m -1 -i]-'0';  
  20.     len_n=strlen(n);  
  21.     for(i=0;i<=len_n -1;i++)  
  22.         b[i]=n[len_n -1 -i]-'0';  
  23.     for(i=0;i<len_n;i++)  
  24.         for(j=0;j<len_m;j++)  
  25.             c[i+j]+=a[j]*b[i];  
  26.     for(i=0;i<2*len_m;i++)  
  27.         if(c[i]>=10)  
  28.         {  
  29.             c[i+1]+=c[i]/10;  
  30.             c[i]%=10;  
  31.         }  
  32.     i=2*len_m;  
  33.     while(c[i]==0)  i--;  
  34.     if(i<0)  printf("0");  
  35.     else      
  36.     {  
  37.         for(;i>=0;i--)  
  38.             printf("%d",c[i]);  
  39.     }  
  40.     return 0;  
  41. }  


4. 除法

除法也是利用数组模拟,不过这里不是直接按照除法的运算来,而是把除法转变为减法运算,从而求得结果。

[cpp] view plain copy
  1. #include <stdio.h>  
  2. #include <string.h>  
  3.   
  4. int len1,len2;  
  5. char s1[905],s2[905];  
  6. int re[905];  
  7.   
  8. void sub()  
  9. {  
  10.     int i=0,j;  
  11.     while(1)  
  12.     {  
  13.         if(s1[i]=='0')  i++;  
  14.         else  
  15.         {  
  16.             j=i;  
  17.             break;  
  18.         }  
  19.     }  
  20.     for(;i<len2;i++)  
  21.         s1[i]=s1[i]-s2[i]+'0';  
  22.     for(i=len2-1;i>j;i--)            //低位开始检测是否小于0  
  23.         if(s1[i]<'0')  
  24.         {  
  25.             s1[i]+=10;  
  26.             s1[i-1]--;  
  27.         }  
  28. }  
  29.   
  30. int main()  
  31. {  
  32.     int i,p;  
  33.     scanf("%s%s",s1,s2);   
  34.     len1=strlen(s1);  
  35.     len2=strlen(s2);  
  36.     if(len1<len2 || (len1==len2 && strncmp(s1,s2,len2)<0))   //如果a<b,直接输出0  
  37.         printf("0\n");   
  38.     p=0;  
  39.     while(1)  
  40.     {  
  41.         re[p]=0;  
  42.         while(strncmp(s1,s2,len2)>=0)      //一直进行减法,直到不能减为止  
  43.         {  
  44.             sub();  
  45.             re[p]++;  
  46.         }  
  47.         p++;  
  48.         if(len1==len2)  break;  
  49.         for(i=len2-1;i>=0;i--)             //在s2前面补0,以便进行减法运算  
  50.             s2[i+1]=s2[i];   
  51.         s2[0]='0';  
  52.         len2++;  
  53.         s2[len2]='\0';  
  54.     }  
  55.     i=0;  
  56.     while(1)  
  57.     {  
  58.         if(re[i]==0)    i++;  
  59.         else            break;  
  60.     }  
  61.     for(;i<p;i++)  
  62.         printf("%d",re[i]);  
  63.     return 0;  
  64. }   
原创粉丝点击