大数加法 减法 乘法 除法 高精度四则运算

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.     len_n=strlen(n);  
  14. for(i=0;i<=len_n -1;i++)  
  15.         b[i]=n[len_n -1 -i]-'0';  
  16. if(len_m>len_n)  
  17.         len_max=len_m;  
  18. else  
  19.         len_max=len_n;  
  20.     k=0;  
  21.     for(i=0;i<=len_max -1;i++)  
  22.     {  
  23.         c[i]=(a[i]+b[i]+k)%10;  
  24.         k=(a[i]+b[i]+k)/10;  
  25.     }  
  26. if(k!=0)    c[len_max]=1;  
  27. if(c[len_max]==1)   printf("1");  
  28. for(i=len_max -1;i>=0;i--)  
  29.         printf("%d",c[i]);  
  30. return 0;  
  31. }  


2. 减法

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

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

copy

  1. if(len_m < len_n)      
  2.     {   
  3.         printf("-");  
  4.         for(i=0;i<len_n;i++)  
  5.         {  
  6.             b[i]-=a[i];  
  7.             if(b[i]<0)  
  8.             {  
  9.                 b[i]+=10;  
  10.                 b[i+1]--;  
  11.             }  
  12.         }  
  13.         i=len_n-1;  
  14. while(b[i]==0)  i--;   
  15.         for(;i>=0;i--)  
  16.             printf("%d",b[i]);  
  17.     }  
  18. else  
  19. for(i=0;i<len_m;i++)  
  20.             a[i]-=b[i];  
  21. if(a[i]<0)  
  22.                 a[i]+=10;  
  23.                 a[i+1]--;  
  24.         i=len_m-1;  
  25. while(a[i]==0)  i--;   
  26. return 0;  
  27. }  

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

copy
        scanf("%s",n);  
  1. if(strlen(m)<strlen(n))  
  2.     {  
  3.         strcpy(temp,m);  
  4.         strcpy(m,n);  
  5.         strcpy(n,temp);  
  6.     len_m =strlen(m);  
  7. for(i=0;i<=len_m -1;i++)  
  8.         a[i]=m[len_m -1 -i]-'0';  
  9. for(i=0;i<len_n;i++)  
  10. for(j=0;j<len_m;j++)  
  11.             c[i+j]+=a[j]*b[i];  
  12. for(i=0;i<2*len_m;i++)  
  13. if(c[i]>=10)  
  14.         {  
  15.             c[i+1]+=c[i]/10;  
  16.             c[i]%=10;  
  17.         }  
  18.     i=2*len_m;  
  19. while(c[i]==0)  i--;  
  20. if(i<0)  printf("0");  
  21. else      
  22. 4. 除法

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

    copy

    int len1,len2;  
  1. char s1[905],s2[905];  
  2. int re[905];  
  3. void sub()  
  4. int i=0,j;  
  5. while(1)  
  6. if(s1[i]=='0')  i++;  
  7.             j=i;  
  8. break;  
  9. for(;i<len2;i++)  
  10.         s1[i]=s1[i]-s2[i]+'0';  
  11. for(i=len2-1;i>j;i--)            //低位开始检测是否小于0  
  12. if(s1[i]<'0')  
  13.             s1[i]+=10;  
  14.             s1[i-1]--;  
  15. }  
  16.     scanf("%s%s",s1,s2);   
  17.     len1=strlen(s1);  
  18.     len2=strlen(s2);  
  19. if(len1<len2 || (len1==len2 && strncmp(s1,s2,len2)<0))   //如果a<b,直接输出0  
  20.         printf("0\n");   
  21.     p=0;  
  22.         re[p]=0;  
  23. while(strncmp(s1,len2)>=0)      //一直进行减法,直到不能减为止  
  24.             sub();  
  25.             re[p]++;  
  26.         p++;  
  27. if(len1==len2)  break;  
  28. for(i=len2-1;i>=0;i--)             //在s2前面补0,以便进行减法运算  
  29.             s2[i+1]=s2[i];   
  30.         s2[0]='0';  
  31.         len2++;  
  32.         s2[len2]='\0';  
  33.     i=0;  
  34. while(1)  
  35. if(re[i]==0)    i++;  
  36. else            for(;i<p;i++)  
  37. }   

http://blog.csdn.net/u011328276/article/details/9464817

相关文章

自1998年我国取消了福利分房的政策后,房地产市场迅速开展蓬...
文章目录获取数据查看数据结构获取数据下载数据可以直接通过...
网上商城系统MySql数据库设计
26个来源的气象数据获取代码
在进入21世纪以来,中国电信业告别了20世纪最后阶段的高速发...