主要内容 #
- 商和余数的求法
- 高精度 / 单精度
1. 商和余数的求法 #
要分两种情况讨论:
- 高精度 / 单精度
- 高精度 / 高精度
2. 高精度 / 低精度 #
也就是说:假设 a 是一个高精度整数,b是一个普通的整数。
【算法分析】
在高精度除以单精度时,从高位到低位逐位相除。最需要注意的问题是,后一位继承前一位的余数问题。
设高精度的数位数字为a[i],单精度数为b,第i+1位除b后的余数位r,把r加到i位时,应乘以进制X,即s=X*r+a[i].
- 注意位移处理即可
int b = 5; int a[] = {8,3,6}; (1) _1___ 5)836 _5___ 3 (2) _16__ 5)836 _5___ 33 _30__ 3 (3) _167__ 5)836 _5___ 33 _30__ 36 __35_ 1
【例程】
#include < iostream > #include < string > using namespace std; void assign(int a[], int a_len, int* dst, int& dst_len) { for (int i = 0; i < a_len; ++i) dst[i] = a[i]; dst_len = a_len; } void divide(int a[], int a_len, int b, int* result, int& result_len) { int c[100] = { 0 }, lenc = 0; // c 用于存放临时的计算结果 if (a[0] == 0) { result_len = 1; assign(c, 1, result, result_len); return; // 0是被除数,则商为0 } int i = 0, x = 0; result_len = 0; for (int i = 0; i < a_len; ++i) { c[i] = (x * 10 + a[i]) / b; x = (x * 10 + a[i]) % b; ++lenc; } // 去除前部可能出现的 0 int c_startID = 0; for (; c_startID < 100; ++c_startID) if (c[c_startID] != 0) break; for (int i = c_startID; i < lenc; ++i) { result[i - c_startID] = c[i]; ++result_len; } } int main() { // 从屏幕获得输入 被除数a和除数b均以字符串的形式输入 string astr, bstr; cin >> astr; cin >> bstr; //获得字符串a和b的长度也就是,a和b的位数 int lena = astr.size(), lenb = bstr.size(); //设置数组a[100]高精度数字a int a[100] = { 0 }, b = 0; for (int i = 0; i < lena; ++i) a[i] = astr[i] - '0'; // 除法不需要将数字倒过来 for (int i = 0; i < lenb; ++i) b += (bstr[i] - '0') * pow(10, lenb - i - 1); // 字符串转 10 进制数 //不能除以0 if (b == 0) return -1; // 设置数组c[100]存储计算结果,c[100]中存储的也是高精度的数字 int c[100] = { 0 }, lenc(0); divide(a, lena, b, c, lenc); // a 是被除数,是高精度值。b是低精度值,用 int 即可存储 // 输出 for (int i = 0; i < lenc; ++i) { cout << c[i]; // 正向输出 } cout << endl; return 0; }
习题 #
请将上面的例题,独立完成一遍。要求必须掌握。下节课要求每个人都能够独立写出上面的代码。
课后练习