主要内容 #
- 高精度加法例题精讲
- 高精度减法例题精讲
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;
}