用C++实现:高精度加法
程序员文章站
2022-03-26 13:31:10
问题描述 输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。 算法描述 由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。 定义一个数组A,A[0]用于存储a的个位,A[1]用于存储a的十位,依此类推。同样可以用一个数组B来存储b。 计算 ......
问题描述
输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。
算法描述
由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。
定义一个数组a,a[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,a[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
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过滤掉。
下一篇: Android平台漏洞挖掘与利用