用C++实现:高精度加法

问题描述
  输入两个整数ab,输出这两个整数的和。ab都不超过100位。
算法描述
  由于ab都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。
  定义一个数组AA[0]用于存储a的个位,A[1]用于存储a的十位,依此类推。同样可以用一个数组B来存储b
  计算c = a + b的时候,首先将A[0]与B[0]相加,如果有进位产生,则把进位(即和的十位数)存入r,把和的个位数存入C[0],即C[0]等于(A[0]+B[0])%10。然后计算A[1]与B[1]相加,这时还应将低位进上来的值r也加起来,即C[1]应该是A[1]、B[1]和r三个数的和.如果又有进位产生,则仍可将新的进位存入到r中,和的个位存到C[1]中。依此类推,即可求出C的所有位。
  最后将C输出即可。
输入格式
  输入包括两行,第一行为一个非负整数a,第二行为一个非负整数b。两个整数都不超过100位,两数的最高位都不是0。
输出格式
  输出一行,表示a + b的值。
样例输入
20100122201001221234567890
2010012220100122
样例输出
20100122203011233454668012
 
思路:先用字符串数组输入,再把字符串转换成整型数组,用数组模拟每一位的加法运算.
 
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 int main(void) 5 { 6 string str1; //输入两个字符串 7 string str2; 8 //数组大小决定精度大小 9 int* arr = new int[101]{ 0 }; 10 int* brr = new int[101]{ 0 }; 11 cin >> str1 >> str2; 12 int len1 = str1.length(); //取得第一个字符串长度 13 int len2 = str2.length(); //取得第二个字符串长度 14 int len; 15 for (int i = 0; i < len1; i++) //把第一个字符串中的每一位转换为整数,存放在数组arr中 16 { 17 arr[i] = str1[len1 - i - 1] - '0'; //减1一定不要减掉了,因为len1是长度,不减1会造成数组越界 18 } //倒着减的原因是要把字符串中的个位转换到整型数组的第一个位置上 19 for (int i = 0; i < len2; i++) //把第二个字符串中的每一位转换为整数,存放在数组brr中 20 { 21 brr[i] = str2[len2 - i - 1] - '0'; 22 } 23 len = (len1 > len2 ? len1 : len2); //取得最大字符串的长度 24 for (int i = 0; i < len; i++) //模拟加法运算 25 { 26 arr[i] = arr[i] + brr[i]; 27 arr[i + 1] = arr[i + 1] + arr[i] / 10; 28 arr[i] = arr[i] % 10; 29 } 30 while ((arr[len] == 0) && (len > 0)) //把数组中多余的0去掉 31 { 32 len--; 33 } 34 for (int i = len ; i >= 0; i--) //逆向输出 35 { 36 cout << arr[i]; 37 } 38 return 0; 39 }

注意:

           (1):设置数组的时候还要把数组每一位都初始化为0,不然后面模拟加法运算的时候就会因为数组没有初始化的问题而出现报错或乱码。 

           (2):根据题目要求合理确定数组大小,不要过小也不要过大

           (3):由于整型数组初始化十分不方便,而且也很难做到像字符串那样输入,所以先按照字符串输入,再把字符串转换成整型数组

           (4):length()函数是取得字符串的有效位数,不包含'\0'

           (5):17行和21行,len1- i - 1的原因是len1是有多少位数字,如果不减1,就会造成数组越界。减i是因为在后面数组模拟加法运算的时候,把数组第一位当成了个位,而在原来字符串里面个位在最后一个位置,所以要减i。

           (6):最后输出之前一定要把数组里面多余的0过滤掉。


__EOF__

本文作者神楽桜KaguraSakura
本文链接https://www.cnblogs.com/KaguraSakura/p/12516970.html
关于博主:hello~好久不见,喜欢的话点个赞吧
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   神楽桜KaguraSakura  阅读(2320)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示