洛谷P1601高精度A+B

1. 题目描述

高精度加法,相当于a+b problem,不用考虑负数.

2. Notes

  1. 整数与字符的转换

    1
    2
    3
    4
    5
    6
    //1位非负数转字符(数字2变成字符2)
    int a = 2;
    char b = a + '0';
    //1位字符转非负数(字符3变为数字3)
    char b = '3';
    int a = b - '0';

    说明:字符2在计算机内部存的是其Ascii码,而数值2在计算机内部存的就是2,因此需要加减转化。

  2. 处理字符串时试着去尝试用string类string的每一个基本单元时char

  3. 字符串倒置

    1
    2
    // a为1个string对象
    reverse(a.begin(),a.end());
  4. 考虑问题要从特殊到一般,不要上来就考虑一般的问题,觉得特殊的简单不想考虑。特殊的搞定了,就可以把一般的转化为特殊的,或者与之建立某种关系,问题也就解决了。如本题中,先考虑两个数位数相等的情况。

  5. 加一行代码的时候,把附近的句子都看一下,在脑子里跑一遍,看看有没有问题,不要想到什么就加什么。

  6. 高精加思路:

    1. 每个数先倒置,
    2. 对位数短的数补零
    3. 从数组第一位开始加,每位都要考虑来自低位的进位,然后分别取余取整来确定计算后该位的数值和要进位的数值。
    4. 最后记得,加完仍然有可能有进位,记得检验(加法中进位最大为1)。

3. 题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<bits/stdc++.h>
using namespace std;
int main(){
string a,b;
int carry=0,i,m,n;
int tmp;
cin>>a>>b;
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
m=a.length();
n=b.length();
//位数少的补0,一般化特殊
if(m>n){
for(int j=0;j<(m-n);j++){
b=b+'0';
}
}else if(n>m){
for(int j=0;j<(n-m);j++){
a=a+'0';
}
m=n; //赋值语句看清位置
}

for(i=0;i<m;i++){
tmp=a[i]-'0'+b[i]-'0'+carry;
carry=tmp/10;
tmp=tmp%10;
a[i]=(char)(tmp+'0');
}
if(carry>0){
a=a+'1';
}
reverse(a.begin(),a.end());
cout<<a;
return 0;
}