主要内容 #
- 进位错位的处理
- 高精度减法
1. 进位,错位处理 #
高精度减法,也是竖式减法。
从个位起逐位相减,遇到负的情况则向上一位借 。整体思路与加法完全一致。
下面例程中的 a b c 均为整形数组。
- 减法借位:
#include <iostream> #include <string> using namespace std; void jianfa(int a[], int a_len, int b[], int b_len, int* result, int& result_len) { int i = 0, x = 0; result_len = 0; //存储两数中的较大位数到max_a_b中 int max_a_b = a_len > b_len ? a_len : b_len; while (i < max_a_b) { int sub_a = i < a_len ? a[i] : 0; int sub_b = i < b_len ? b[i] : 0; // 减法 if (sub_a < sub_b) { --a[i + 1]; sub_a += 10; } result[i] = sub_a - sub_b; result_len++; i++; } // 假如结果全都是0,输出一个0 int sum(0); for (int i = 0; i < result_len; ++i) { sum += result[i]; if (sum != 0) break; } if (sum == 0) result_len = 1; } int main() { //输入的数字以字符串的形式存储 string astr, bstr, temp; cin >> astr; cin >> bstr; //获取两个字符串的长度即两个数字的位数 int isSmaller = 0; //第一个数是否比第二个数大 int lena = astr.size(), lenb = bstr.size(); if(lenb > lena){ isSmaller = 1; } if(lena == lenb){ for(int i = 0; i < lena; i++){ if(astr[i] < bstr[i]){ isSmaller = 1; break; } } } //astr中存储较大的数组 //记得交换a b数组的长度! if(isSmaller){ swap(astr, bstr); swap(lena, lenb); } int a[100], b[100]; for (int i = 0; i< astr.size(); ++i) a[lena - i - 1] = astr[i] - '0'; // 将字符串的数字 for (int i = 0; i< bstr.size(); ++i) b[lenb - i - 1] = bstr[i] - '0';//将字符转化为数字 int c[100] = { 0 }, lenc = 0; jianfa(a, lena, b, lenb, c, lenc); // 必须是两个非负数 //找到不是零的第一位数字 int not_zeors = lenc - 1; while(c[not_zeors] == 0){ if(not_zeors == 0){ break; } not_zeors--; } //小数减大数,要加上负号 if(isSmaller){ cout << "-"; } for(int i = not_zeors; i >= 0; i--){ cout << c[i]; } cout << endl; return 0; }
2. 高精度减法 #
请输入两个数,计算它们的差。
【算法分析】
竖式方法举例:
- 大数减小数:189 – 159
- 小数减大数:159 – 189
【例程】
习题 #
请将上面的例题,独立完成一遍。要求必须掌握。下节课要求每个人都能够独立写出上面的代码。
课后练习