PAT 乙级练习 1017 A除以B
PAT 乙级练习 题解合集
题目
本题要求计算 A/B,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数。你需要输出商数 Q 和余数 R,使得 A=B×Q+R 成立。
输入格式:
输入在一行中依次给出 A 和 B,中间以 1 空格分隔。
输出格式:
在一行中依次输出 Q 和 R,中间以 1 空格分隔。
输入样例:
123456789050987654321 7
输出样例:
17636684150141093474 3
思路
模拟手动计算除法,核心在于divide
函数中remain
的变化
测试点1
的数据应该类似于1 6
这样的输入,即商数Q == 0
。
代码
#include <stdio.h>
#define MAX 1010
// 输入大整数 a,长度 len,除数 b,返回大整数 q ,余数 r
void divide(int *a, int len, int b , int *q, int *r) {
int i, remain = 0;
for (i = 0; i < len; ++i) {
remain *= 10;
remain += a[i];
q[i] = remain / b;
remain %= b;
}
*r = remain;
}
// 打印大整数 a,去掉前导 0
void print(int *a, int len) {
int i = 0;
while (i < len && a[i] == 0)
++i;
if (i == len) // 注意特判 0 的情况
printf("0");
else
while (i < len)
printf("%d", a[i++]);
}
int main() {
char input;
int a[MAX], len = 0, b, q[MAX], r;
while ((input = getchar()) != ' ')
a[len++] = input - '0';
scanf("%d", &b);
divide(a, len, b, q, &r);
print(q, len);
printf(" %d", r);
return 0;
}