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