输入两个正整数,求它们的商(做整除)。
【算法分析】
做除法时,每一次的商的值都在0-9,每次求得的余数连接以后的若干位得到新的被除数,继续做除法。因此,在做高精度除法时,要涉及到乘法运算和减法运算,还有移位处理。当然,为了程序简洁,可以避免高精度乘法,用0~9次循环减法取代得到商的值。这里,我们讨论一下高精度数除以单精度数的结果,采取的方法是按位相除法。
【参考程序】
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int main() {
char a1[100]; // 被除数是高精度,使用字符数组存储
int b; // 除数是单精度,使用int存储
int a[100], c[100], lena, lenc, x=0; // x是余数
memset(a, 0, sizeof(a)); // 被除数
memset(c, 0, sizeof(c)); // 商
gets(a1); // 输入被除数字符串
cin >> b; // 输入除数
lena = strlen(a1);
for (int i=0; i<lena; i++) {
a[i+1] = a1[i] - 48;
}
for (int i=1; i<=lena; i++) { // 按位相除
c[i] = (x*10 + a[i]) / b;
x = (x*10 + a[i]) % b;
}
lenc = 1;
while (c[lenc]==0 && lenc<lena) {
lenc++; // 删除前导0
}
for (int i=lenc; i<=lena; i++) {
cout << c[i];
}
return 0;
}