1124: 高精度高精度加法
题目描述
输入两个正整数(最多100000位),输出它们的和。
输入
两行,两个整数。
输出
一行,一个整数
样例输入
999999999999999999999999999999999999999999999999999999
12345678999999999999999999999999
样例输出
1000000000000000000000012345678999999999999999999999998
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cmath> 5 using namespace std; 6 int main() 7 { 8 char y[100005],x[100005]; //存储字符串 9 int s[100005],c[100005],ans[100005]; 10 int l,i,j,k,p,q,w,t,z = -1,o,u = -1; 11 gets(y); 12 gets(x); 13 for(i = 0;i <= 100005;i++) 14 { 15 if(y[i] == '\0') 16 { 17 i = i - 1; 18 break; 19 } 20 } //判断字符串长度 21 for(t = i;t >= 0;t--) 22 { 23 z = z + 1; 24 s[z] = y[t] - 48; 25 } //把字符串转化为数组并且倒过来便于计算 26 for(j = 0;j <= 100005;j++) 27 { 28 if(x[j] == '\0') 29 { 30 j = j - 1; 31 break; 32 } 33 } //判断字符串长度 34 for(o = j;o >= 0;o--) 35 { 36 u = u + 1; 37 c[u] = x[o] - 48; //把字符串转化为数组并且倒过来便于计算 38 } 39 if(i >= j) 40 { 41 for(k = 0;k <= i;k++) 42 { 43 ans[k] = c[k] + s[k] + ans[k]; //正常相加 44 ans[k + 1] =ans[k] / 10; //和超过10进位 45 ans[k] = ans[k] % 10; //保留下一位小数 46 } 47 } 48 else //循环次数不同,计算内容相同 49 { 50 for(k = 0;k <= j;k++) 51 { 52 ans[k] = c[k] + s[k] + ans[k]; 53 ans[k + 1] = ans[k] / 10; 54 ans[k] = ans[k] % 10; 55 } 56 } 57 if(i > j) 58 { 59 w = i + 1; 60 } 61 else 62 w = j + 1; //给结果前多加一位,防止前一位相加进十 63 if(ans[w] == 0) 64 { 65 w = w - 1; //如果前一位相加没有进十则直接忽略掉这一位 66 } 67 for(k = w;k >= 0;k--) 68 { 69 printf("%d",ans[k]); //倒叙输出 70 71 } 72 return 0; 73 74 }
**高精度加法,就是模拟竖式。1.把字符串转化为数组,并且转化成计算用的数组顺序。
2.把数组相加,大于十进位。
3.最后倒叙输出数字。