wiki oi 3116 高精度练习之加法

题目描述 Description

给出两个正整数A和B,计算A+B的值。保证A和B的位数不超过500位。

输入描述 Input Description

读入两个用空格隔开的正整数

输出描述 Output Description

输出A+B的值

样例输入 Sample Input

3 12

样例输出 Sample Output

15

数据范围及提示 Data Size & Hint

两个正整数的位数不超过500位

分析:和减法一样,去掉了两个数的大小比较,发现没必要,还有发现不用判断cc大于10么, 直接cc%=10;

代码:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<math.h>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 char a[501],b[501];
 8 int c[502];
 9 int main()
10 {
11     cin>>a>>b;
12     memset(c,0,sizeof(c));
13     int alen=strlen(a);
14     int blen=strlen(b);
15     int i=alen-1,j=blen-1,k=0;
16     int carry=0;
17     while(i>=0&&j>=0)
18     {
19         int cc=(a[i--]-'0')+(b[j--]-'0')+carry;
20         carry=cc/10;
21         cc%=10;
22         c[k++]=cc;
23     }
24     while(i>=0)
25     {
26         int cc=(a[i--]-'0')+carry;
27         carry=cc/10;
28         cc%=10;
29         c[k++]=cc;
30     }
31     while(j>=0)
32     {
33         int cc=(b[j--]-'0')+carry;
34         carry=cc/10;
35         cc%=10;
36         c[k++]=cc;
37     }
38     if(carry!=0)c[k++]=carry;//最后判断进位是不是为0不是要进一位 避免23+99=22;
39     int last=k;
40     for(int l=k; l>=0; l--)//找开头不是0的那个起点
41         if(c[l]!=0)
42         {
43             last=l;
44             break;
45         }
46     for(int l=last; l>=0; l--)printf("%d",c[l]);
47     printf("\n");
48     return 0;
49 }

 

posted @ 2014-12-28 00:24  CodeNoob  阅读(168)  评论(0编辑  收藏  举报