大数的四则运算

[复制链接]
542|5
 楼主| functions 发表于 2019-9-14 17:55 | 显示全部楼层 |阅读模式
    在处理大数的运算时,一般采用数组去模拟,下面介绍大数的加、减、乘、除四则运算的实现方法。
1.加法。
  如:
  Input: 123456789123456789123456789
            1
  Output:123456789123456789123456790
  输入采用字符数组保存,然后将输入存在整形数组里,然后逐位相加即可,同时注意进位处理。

  1. #include<stdio.h>
  2. #include<string.h>
  3. int max(int x,int y)
  4. {
  5.     if(x>y)
  6.         return x;
  7.     else
  8.         return y;
  9. }

  10. int main(void)
  11. {
  12.    
  13.     char str1[510],str2[510];
  14.     while(scanf("%s %s",str1,str2)==2)
  15.     {
  16.         
  17.         int a[510]={0},b[510]={0},c[510]={0},i;
  18.         int m,n,max1=0;
  19.         m=strlen(str1);
  20.         n=strlen(str2);
  21.         max1=max(m,n);
  22.         for(i=0;i<max1;i++)
  23.         {
  24.             a[m-i-1]=str1[i]-48;
  25.             b[n-i-1]=str2[i]-48;
  26.         }
  27.         for(i=0;i<max1;i++)
  28.             c[i]=a[i]+b[i];
  29.         for(i=0;i<max1;i++)
  30.         {
  31.             c[i+1]=c[i]/10+c[i+1];
  32.             c[i]=c[i]%10;
  33.         }
  34.         if(c[max1]!=0)
  35.         {
  36.             for(i=max1;i>=0;i--)
  37.                 printf("%d",c[i]);
  38.         }
  39.         else
  40.         {
  41.             for(i=max1-1;i>=0;i--)
  42.                 printf("%d",c[i]);
  43.         }
  44.         printf("\n");
  45.     }
  46.     return0;
  47. }


评论

感谢分享  发表于 2019-9-15 10:30
 楼主| functions 发表于 2019-9-14 17:55 | 显示全部楼层
2.减法

Input:123456789123456789

         1

Output:123456789123456788

原理同加法一样(这里假设第一个数大于第二个数)

  1. #include<stdio.h>

  2. #include<string.h>

  3. int main(void)
  4. {
  5.     char s1[505],s2[505];
  6.     while(scanf("%s%s",s1,s2)==2)
  7.     {
  8.         int i,j,len1,len2;
  9.         int a[105]={0},b[105]={0};
  10.         len1=strlen(s1);
  11.         len2=strlen(s2);
  12.         for(i=len1-1,j=0;i>=0;i--,j++)
  13.         {
  14.             a[j]=s1[i]-48;
  15.         }
  16.         for(i=len2-1,j=0;i>=0;i--,j++)
  17.         {
  18.             b[j]=s2[i]-48;
  19.         }
  20.         for(i=0;i<len1;i++)
  21.         {
  22.             a[i]=a[i]-b[i];
  23.             if(a[i]<0)
  24.             {
  25.                 a[i]+=10;
  26.                 a[i+1]--;
  27.             }
  28.         }
  29.         i=len1-1;
  30.         while(a[i]==0)
  31.         {
  32.             i--;
  33.         }
  34.         for(;i>=0;i--)
  35.         {
  36.             printf("%d",a[i]);
  37.         }
  38.         printf("\n");
  39.     }
  40.     return0;
  41. }
 楼主| functions 发表于 2019-9-14 17:56 | 显示全部楼层
3.乘法

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

a   12345

b[j]        23

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

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

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

            123

         *   12

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

             246   

        + 123

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

            1476

  1. #include<iostream>
  2. #include<string.h>
  3. usingnamespace std;


  4. int main(void)
  5. {
  6.     char s1[510],s2[510],temp[510];
  7.     int a[510],b[510],c[1010];
  8.     while(scanf("%s%s",s1,s2)==2)
  9.     {
  10.         int i,j,h;
  11.         int len1,len2;
  12.         if(strlen(s1)<strlen(s2))
  13.         {
  14.             strcpy(temp,s1);
  15.             strcpy(s1,s2);
  16.             strcpy(s2,temp);
  17.         }
  18.         len1=strlen(s1);
  19.         len2=strlen(s2);
  20.         memset(c,0,sizeof(c));
  21.         for(i=len1-1,j=0;i>=0;i--,j++)
  22.         {
  23.             a[j]=s1[i]-48;
  24.         }
  25.         for(i=len2-1,j=0;i>=0;i--,j++)
  26.         {
  27.             b[j]=s2[i]-48;
  28.         }
  29.         for(i=0;i<len2;i++)
  30.         {
  31.             for(j=0;j<len1;j++)
  32.             {
  33.                 c[i+j]=a[j]*b[i]+c[i+j];
  34.             }
  35.         }
  36.         for(i=0;i<2*len1;i++)
  37.         {
  38.             if(c[i]>=10)
  39.             {
  40.                 c[i+1]=c[i+1]+c[i]/10;
  41.                 c[i]=c[i]%10;
  42.             }
  43.         }
  44.         i=2*len1;
  45.         while(c[i]==0)
  46.         {
  47.             i--;
  48.         }
  49.         if(i<0)
  50.         {
  51.             printf("0\n");
  52.         }
  53.         else
  54.         {
  55.             for(;i>=0;i--)
  56.                 printf("%d",c[i]);
  57.             printf("\n");
  58.         }   
  59.     }
  60.     return0;
  61. }
 楼主| functions 发表于 2019-9-14 17:56 | 显示全部楼层
4.除法

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

  1. #include<stdio.h>
  2. #include<string.h>

  3. int len1,len2;
  4. char s1[905];
  5. char s2[905];
  6. int re[905];

  7. void sub()
  8. {
  9.     int i=0;
  10.     int j;
  11.     while(1)
  12.     {
  13.         if(s1[i]=='0')
  14.             i++;
  15.         else
  16.         {
  17.             j=i;
  18.             break;
  19.         }
  20.     }
  21.     for(;i<len2;i++)
  22.     {
  23.         s1[i]=s1[i]-s2[i]+'0';
  24.     }
  25.     for(i=len2-1;i>j;i--)    //低位开始检测是否小于0
  26.     {
  27.         if(s1[i]<'0')
  28.         {
  29.             s1[i]+=10;
  30.             s1[i-1]--;
  31.         }
  32.     }
  33. }

  34. int main(void)
  35. {
  36.     int i,p;
  37.     while(scanf("%s%s",s1,s2)==2)
  38.     {
  39.         len1=strlen(s1);
  40.         len2=strlen(s2);
  41.         if(len1<len2||(len1==len2&&strncmp(s1,s2,len2)<0))   //如果a<b,直接输出0
  42.         {
  43.             printf("0\n");
  44.             continue;
  45.         }
  46.         p=0;
  47.         while(1)
  48.         {
  49.             re[p]=0;
  50.             while(strncmp(s1,s2,len2)>=0)       //一直进行减法,直到不能减为止
  51.              {
  52.                 sub();
  53.                 re[p]++;
  54.             }
  55.             p++;
  56.             if(len1==len2)
  57.                 break;
  58.             for(i=len2-1;i>=0;i--)             //在s2前面补0,以便进行减法运算
  59.              {
  60.                 s2[i+1]=s2[i];
  61.             }
  62.             s2[0]='0';
  63.             len2++;
  64.             s2[len2]='\0';
  65.         }
  66.         i=0;
  67.         while(1)
  68.         {
  69.             if(re[i]==0)
  70.                 i++;
  71.             else
  72.                 break;
  73.         }
  74.         for(;i<p;i++)
  75.             printf("%d",re[i]);
  76.         printf("\n");
  77.     }
  78.     return0;
  79. }
airwill 发表于 2019-9-14 22:27 | 显示全部楼层
乘除法, 比较复杂一些, 多层递归了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

39

主题

446

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部