基础练习 高精度加法
Posted zhenglijie
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础练习 高精度加法相关的知识,希望对你有一定的参考价值。
问题描述
输入两个整数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
思路:先各位相加,最后判断是否进位,前几天写过,刚学了点c++,所以用c++又写了一下。
1 #include<iostream> 2 #include<string> 3 4 using namespace std; 5 6 #define max(a,b) (a > b ? a : b) 7 8 void add(string longString, string shortString, int* num3) 9 { 10 int k = -1; 11 int longLen = longString.size(); 12 int shortLen = shortString.size(); 13 14 for (int i = 1; i <= longLen; i++) 15 { 16 num3[i] = longString[longLen - i] - 48; 17 } 18 for (int i = 1; i <= shortLen; i++) 19 { 20 num3[i] += shortString[shortLen - i] - 48; 21 } 22 } 23 24 int main() 25 { 26 string num1; 27 string num2; 28 int *num3 = new int[102]; 29 int k = -1; 30 31 cin >> num1; 32 cin >> num2; 33 34 if (num1.size() >= num2.size()) //如果1长1作为长字符串 35 { 36 add(num1, num2, num3); 37 } 38 else 39 { 40 add(num2, num1, num3); //如果2长2作为长字符串 41 } 42 43 int m = max(num1.size(), num2.size()); 44 for (int i = 1; i <= m; i++) 45 { 46 if (num3[i] >= 10) 47 { 48 num3[i] -= 10; 49 ++num3[i + 1]; 50 } 51 } 52 53 if (num3[m + 1] > 0) 54 { 55 m++; 56 } 57 58 59 for (int i = m; i >= 1; i--) 60 { 61 cout << num3[i]; 62 } 63 64 return 0; 65 }
以上是关于基础练习 高精度加法的主要内容,如果未能解决你的问题,请参考以下文章