本题要求计算 A/B,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数。你需要输出商数 Q 和余数 R,使得 A=B×Q+R 成立。
输入格式:
输入在一行中依次给出 A 和 B,中间以 1 空格分隔。
输出格式:
在一行中依次输出 Q 和 R,中间以 1 空格分隔。
输入样例:
123456789050987654321 7
输出样例:
17636684150141093474 3
思路
大整数加减乘除要用结构体去实现手算的过程。
代码
#include<cstdio>
#include<cstring>
struct BigNumber {
int number[1001];
int length;
BigNumber() { /* 构造函数,给成员赋初值 */
length = 0;
memset(number, 0, sizeof(number));
}
};
BigNumber change(char*); /* 将字符串转换成BigNumber对象的函数 */
BigNumber divide(BigNumber, int, int&);
int main() {
char input1[1001];
int B;
scanf("%s%d", input1, &B);
int remainder = 0;
BigNumber A = change(input1);
BigNumber result = divide(A, B, remainder);
/** 输出BigNumber对象 */
for(int i = result.length - 1; i >= 0; i--) {
printf("%d", result.number[i]);
}
printf(" %d", remainder);
return 0;
}
/******************函数实现***************************/
BigNumber change(char* input) {
BigNumber result;
result.length = strlen(input);
for(int i = 0; i < result.length; i++) {
result.number[i] = input[result.length - 1 -i] - '0';
}
return result;
}
BigNumber divide(BigNumber a, int b, int& remainder) {
BigNumber result;
result.length = a.length;
for(int i = a.length - 1; i >= 0; i--) {
remainder = remainder * 10 + a.number[i]; /* 和上一位遗留的余数组合 */
if(remainder < b) { /* 不够除,该位为0 */
result.number[i] = 0;
}
else { /* 够除 */
result.number[i] = remainder / b; /* 商 */
remainder = remainder % b; /* 计算新的余数 */
}
}
while(result.length - 1 >= 1 && result.number[result.length - 1] == 0) {
result.length--; /* 去除高位的0,同时至少保留一位最低位 */
}
return result;
}