加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-14 03:58:52 所属栏目:大数据 来源:网络整理
导读:1. 加法 输入采用字符数组保存,然后将输入存在整形数组里,然后逐位相加即可,同时注意进位处理。 [cpp] ? view plain copy #include?stdio.h ?? #include?string.h ?? ?? int ?main()?? {?? ???? char ?m[555],n[555];?? ???? int ?i,len_m,len_n,len_max,

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("0n");???
    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]='';??
    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

    (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读