NOI1.6 10:大整数加法
关于高精度的计算真的很坑人啊 ==
加法据说是其中最简单的,无非就是数组大小,进位,前导的零的问题(对于加法)。
特别注意:自己尝试固然好,但是不可否认,课本范例更加高效!
题目:
10:大整数加法
- 总时间限制:1000ms 内存限制:65536kB
- 描述
-
求两个不超过200位的非负整数的和。注意结果可能超200位
- 输入
- 有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。
- 输出
- 一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
- 样例输入
-
22222222222222222222 33333333333333333333
- 样例输出
-
55555555555555555555
- 来源
- 程序设计实习2007
常规的输入样例(注意:请先确保位数足够):
999999999999999 1
1000000000000000
特殊的输入样例:
输入1:(测试前导的0)
0000001000000 0000001000000
输出1:
2
输入2:(测试保留最后一个0)
000000000000 000000000000
输出2:
0
万恶的9分...
思路+题解
1 # include <stdio.h> 2 # include <iostream> 3 # include <string.h> 4 5 using namespace std; 6 7 int a[250], b[250], c[250]; 8 char al[250],bl[250]; 9 10 int main () 11 { 12 scanf("%s", al); 13 scanf("%s", bl); 14 15 int lena = strlen(al); 16 int lenb = strlen(bl); 17 18 for(int i = 0; i < lena; i++) 19 { 20 a[lena-i] = al[i]-'0'; 21 } 22 for(int i = 0; i < lenb; i++) 23 { 24 b[lenb-i] = bl[i]-'0'; 25 } 26 27 int t = 0; 28 int i = 1; 29 for(i = 1; i <= lenb||i<=lena; i++) 30 { 31 c[i] = a[i] + b[i] + t; 32 33 t = c[i] / 10; 34 c[i] %= 10; 35 } 36 37 if(t) 38 { 39 c[i] = t; 40 } 41 42 while(c[i] == 0 && i > 1) i--; 43 for(int j = i; j >=1; j--) 44 { 45 printf("%d", c[j]); 46 } 47 return 0; 48 }
以下是自己尝试的老版本,仅做记录,不作为学习。
1 /* 2 高精度加法注意 3 * 输入可能也有前导的0,本程序在输出时集中去0.不能只去一个零。 4 * 输入200位,输出可能有201位(最高位进位)所以把内存弄得稍大一些总是好的。 5 * 在输出时集中去零时要注意,万一是个0+0=0那不就没有输出结果了吗,所以额外 6 判断答案只有0的情况。 7 */ 8 9 10 # include <stdio.h> 11 # include <string.h> 12 # include <iostream> 13 14 using namespace std; 15 16 int main () 17 { 18 char a1[250], b1[250]; 19 int a[250], b[250], c[250], lena, lenb, lenc, i, x; 20 21 memset(a, 0, sizeof(a)); 22 memset(b, 0, sizeof(b)); 23 memset(c, 0, sizeof(c)); 24 25 cin.getline(a1, 250); 26 cin.getline(b1, 250); 27 28 lena = strlen(a1); 29 lenb = strlen(b1); 30 31 for(int i = 0; i <= lena-1; i++) 32 { 33 a[lena-i] = a1[i] - '0'; 34 } 35 for(int i = 0; i <= lenb-1; i++) 36 { 37 b[lenb-i] = b1[i] - '0'; 38 } 39 40 lenc = 1; 41 x = 0; //进位 42 43 while(lenc <= lena||lenc <= lenb) 44 { 45 c[lenc] = a[lenc] + b[lenc] + x; 46 47 x = c[lenc]/10; 48 c[lenc] %= 10; 49 lenc++; 50 } 51 52 c[lenc] = x; 53 54 if(c[lenc] == 0) 55 { 56 lenc --; 57 } 58 59 bool isStart = false; 60 for(int i = lenc; i >= 1; i--) 61 { 62 if((isStart || c[i]) || i == 1)//如果是最后一位了,是0也要输出 63 { 64 cout<< c[i]; 65 } 66 67 isStart = isStart||c[i]; 68 } 69 return 0; 70 }