题目:
本题要求计算 A/B,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数。你需要输出商数 Q 和余数 R,使得 A=B×Q+R 成立。
输入格式:
输入在一行中依次给出 A 和 B,中间以 1 空格分隔。
输出格式:
在一行中依次输出 Q 和 R,中间以 1 空格分隔。
输入样例:
123456789050987654321 7
输出样例:
17636684150141093474 3
思路:
- 读题抽象:输入一个超大整数A(最多1000位),一个整数B,输出A➗B的商和余数。
- 由于A有1000位,long long也存不下(long long最大只有19位)
- 模拟手工竖式除法,逐位计算。
- 发现每一步都是余数×10+下一位数字,再除以B
- 注意:需要去前导零!

代码:
#include <stdio.h>
#include <string.h>
#define MAXN 1010
char a[MAXN]; /* 被除数 A 的字符串形式 */
int ans[MAXN]; /* 商的每一位 */
int len = 0; /* 商的位数 */
int main() {
int b; /* 除数 B */
scanf("%s %d", a, &b);
int r = 0; /* 余数,初始为0 */
int alen = strlen(a);
/* 高精度除法:逐位处理 */
for (int i = 0; i < alen; ++i) {
int digit = a[i] - '0'; /* 当前位数字 */
int num = r * 10 + digit; /* 余数*10 + 当前位 = 新的被除数 */
if (len > 0 || num / b > 0) { /* 商的前导零不保存 */
ans[len++] = num / b; /* 保存商的当前位 */
}
r = num % b; /* 更新余数 */
}
/* 输出商 */
if (len == 0) printf("0"); /* 商为0的特殊情况 */
else {
for (int i = 0; i < len; ++i)
printf("%d", ans[i]);
}
/* 输出余数 */
printf(" %d\n", r);
return 0;
}