跳至正文
View Categories

2 min read

主要内容 #

  1. 高精度加法例题精讲
  2. 高精度减法例题精讲

1. 高精度加法例题精讲 #

1.1 计算过程 #

1. 数据的接收和存储:当输入的数很长时,可以采用字符串的方式输入,并将每一位数字取出存入数组中。
2. 高精度位数的确定:接收时往往是字符串的,字符串的长度就是数字的位数。
3. 进位处理:

c[i]=a[i]+b[i];
if(c[i]>=10){c[i]%=10;++c[i+1];}

1.2 例题 #

求两个不超过200位的非负整数的和。
输入:
有两行,每一行是不超过200位的非负整数,可能有多余的前导0。
输出:
一行,即两行数相加的结果。结果里不能包含多余的前导0,即如果结果是342,那就不能输出位0342。
样例输入:
222222222222222222
333333333333333333
样例输出:
555555555555555555
参考程序

#include < iostream >
#include < string >

using namespace std;

int a[200],b[200],c[200];
string al, bl;

int main(){
    int la, lb, lc, x = 0;
    //输入al和bl
    cin >> al >> bl;
    //la lb中分别存储着字符串al,bl的长度。
    la = al.size();
    lb = bl.size();
    //将两个字符串中的数字逆序存贮在两个数组中
    for(int i = 0; i < la; ++i) a[la - i] = al[i] - 48;
    for(int i = 0; i < lb; ++i) b[lb - i] = bl[i] - 48;

    //从第一位开始相加
    lc = 1;
    //判断两个整数是否都没有算完
    while(lc <= la || lc <= lb){
        //x表示前一次的进位
        c[lc] = a[lc] + b[lc] + x;
        //判断是否进 1
        x = c[lc] / 10;
        //求相加后数字的个位
        c[lc] %= 10;
        //计算下一位数
        lc++;
    }
    c[lc] = x;
    //去除多余的前导0
    while(c[lc] == 0 && lc >1) lc--;
    for(int i = lc; i >=1; --i) cout << c[i];
    cout << endl;
    return 0;
}

2. 高精度加法例题精讲 #

2.1 计算过程 #

1. 数据的接收和存储:当输入的数很长时,可以采用字符串的方式输入,并将每一位数字取出存入数组中。
2. 高精度位数的确定:接收时往往是字符串的,字符串的长度就是数字的位数。
3. 借位处理:

if(a[i] < b[i]){--a[i+1];a[i] += 10;}
c[i] = a[i] - b[i];

2.2 例题 #

求两个大的正整数相减的差。
输入:
有两行,每一行是被减数a,第二行是减数b(a > b)。每个大整数不超过200位,不会有多余的前导0;
输出:
一行,即所求的差。
样例输入:
99999999999999999999999999999999999
9999999999999999
样例输出:
99999999999999999990000000000000000
参考程序

#include < iostream >
#include < string >

using namespace std;

int a[200],b[200],c[200];
string al, bl;

int main(){
int lena, lenb, lenc;
    //分别读入字符串al和bl
    cin >> al >> bl;
    //字符串长度
    lena = al.size();
    lenb = bl.size();
    //将两个字符船分别转存到两个数组中
    for(int i = 0; i < lena; ++i) a[lena - i] = al[i] - '0';
    for(int i = 0; i < lenb; ++i) b[lenb - i] = bl[i] - '0';
    for(int i = 1; i <= lena; i++){
        //如果不够减就向前借一位
        if(a[i] < b[i]){
            a[i] += 10;
            a[i+1]--;
        }
        //将被减数的每一位分别减去减数的每一位
        c[i] = a[i] - b[i];
    }
    lenc = lena;
    //删除多余的前导0
    while(c[lenc] == 0 && lenc > 1) lenc--;
    for(int i = lenc; i >= 1; --i){
        cout << c[i];
    }
    cout << endl;
    return 0;
}