[关闭]
@smartZhou 2019-01-09T03:17:36.000000Z 字数 990 阅读 97

高精度算法

算法


高精度算法之大数加法

算法思路:

用字符串string类型去保存两个数a,b,最终的结果保存在a字符串中。所以先把a,b中的长字符串放在a中,短字符串放在b中,可以利用SLT中内置的swap函数实现。将长串放在a中的代码如下:
  1. if(a.size()<b.size())
  2. {
  3. string temp=a;
  4. a=b;
  5. b=temp;
  6. }

或者

  1. if(a.size()<b.size())
  2. {
  3. swap(a,b);
  4. }
   基本思路为使用string将所需要求得大数字存起来,然后进行倒序相加,发现和超过十之后取模进位。
   按从低位到高位的顺序两个数字的每一位对应相加,并加上低一位的进位(如果有进位的话),如果某一位对应的数字加起来大于10,就对10取模得到当前位上的数字,再向高位进1,然后再考虑更高一位数字的相加,依次类推,如果位数较长的那个数字的最高位还有进位,别忘记了位数还要增加1。
  1. /*****************************
  2. Project:High precision algorithm
  3. File:
  4. Auther:smartZdw
  5. Modified Date: 2019-1-9
  6. *****************************/
  7. #include <iostream>
  8. #include <string>
  9. using namespace std;
  10. string BigDataAdd(string,int,string,int);
  11. int main()
  12. {
  13. string a,b;
  14. cin>>a>>b;
  15. if(a.size()<b.size())
  16. {
  17. swap(a,b);
  18. }
  19. cout<<BigDataAdd(a,a.size(),b,b.size())<<endl;
  20. return 0;
  21. }
  22. string BigDataAdd(string a,int lena,string b,int lenb)
  23. {
  24. int aa,bb,sum,flag=0;
  25. while(lena>0)
  26. {
  27. aa=a[lena-1]-'0';
  28. if(lenb>0)
  29. bb=b[lenb-1]-'0';
  30. else
  31. bb=0;
  32. sum=aa+bb+flag;
  33. if(sum>10)
  34. {
  35. a[lena-1]='0'+sum%10;
  36. flag=1;
  37. }
  38. else
  39. {
  40. a[lena-1]='0'+sum;
  41. flag=0;
  42. }
  43. lena--;
  44. lenb--;
  45. }
  46. if(flag==1)
  47. a="1"+a;
  48. return a;
  49. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注