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 /*
 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 }

猜你喜欢

转载自www.cnblogs.com/serverror/p/12585429.html