P1601 A+B Problem(高精)

题目

 源代码

 1 #include <iostream>
 2 using namespace std;
 3 int a[1000001], b[1000001], c[1000001];
 4 int main()
 5 {
 6     string s1, s2;
 7     cin >> s1;
 8     cin >> s2;
 9     //将两个大数存入数组a和b中
10     for (int i = 0; i < s1.length(); i++)
11     {
12         a[i] = s1[s1.length() - 1 - i] - '0';
13     }
14     for (int i = 0; i < s2.length(); i++)
15     {
16         b[i] = s2[s2.length() - 1 - i] - '0';
17     }
18     //此时,数组中第一位是个位,第二位是十位,依次类推
19     int num;//表示位数相加的次数 例如100+99需要位数相加三次(个位,十位,百位)
20     if (s1.length() < s2.length())
21     {
22         num = s2.length();
23     }
24     else {
25         num = s1.length();
26     }
27     //进行数字的相加
28     for (int i = 0; i < num + 1; i++)//此处的num需要+1,避免最后一位计算时仍需要向前进一位
29     {
30         c[i] = c[i] + a[i] + b[i];//需要c[i]是因为在进位的时候需要使用
31         if (c[i] >= 10)//大于十需要向前进一位
32         {
33             c[i] %= 10;
34             c[i + 1]++;
35         }
36     }
37     //如果计算后的最高位为0,就不需要输出了,如果不是,需要输出
38     //假如9099+1001,在上面的for循环中在最后一次循环时,需要向前进位
39 //结果为5位,此时最高位就需要单独输出一下
40 if (c[num] != 0) 41 { 42 cout << c[num]; 43 } 44 for (int i = num - 1; i >= 0; i--) 45 { 46 cout << c[i]; 47 } 48 return 0; 49 }

思路:

  特别大的数字进行相加,普通的int难以实现,一般就选择将大数存入数组中,从数字的个位开始,依次相加,超过10就向前进一位,得出最后的结果输出,

  特别示例(9099+1001)相加之后成了五位数字,在28行中体现(需要在万位上多加一次,也就是num+1次循环,并且在最后需要判断最高位是否为0,如果是0,表示最后的结果的位数没有增加,不需要额外输出,如果不是0,则表示结果的位数变多,需要将最高位输出

posted @ 2024-01-30 15:13  连师傅只会helloword  阅读(3)  评论(0编辑  收藏  举报