1017. A除以B (20)
原题: https://www.patest.cn/contests/pat-b-practise/1017
实现思路: 核心代码其实就5行, 刚开始也想到要用字符串一个个处理, 但思路没打开.
直到看到一位网友提示: "把草稿纸计算除法, 还原成代码就行". 才恍然大悟. 是的,
解决本题, 首先要把草稿纸算除法弄明白.
首先把A存在字符串里, 然后遍历A, 一位一位的考虑, 由于B只可能是1-9, 也就是最多
用2位就可以除以B, 每次计算要么当前位直接>B, 要么当前位+(10上一位的余数)
统一实现就是, 每次都用当前为+((10上一位的余数))来除以B, 并且保存结果和余数.
完整实现:
#include <stdio.h>
void print (char arr[], int len, int mod);
int main () {
char a[1020];
int b;
char res[1020]; // 结果字符串
int mod = 0; // 余数
int len = 0; // 结果字符串长度(最后一位存储'\0')
int now; // 每一次的商
char *ptr;
ptr = a;
scanf("%s %d", a, &b);
// 每次都拿到结果和余数
while (*ptr != '\0') {
// 想象一下草稿纸算除法, 每次"剩下"的数, 都是当前数+上一位的余数*10
// 余数为零也不例外, 像这样 a[i] + 0 * 10
now = (int)(*ptr - '0') + (mod * 10);
res[len] = (char)((now / b) + '0');
len++;
mod = now % b;
ptr++;
}
res[len] = '\0'; // 指向结果字符串最后一位 '\0'
print(res, len, mod);
// 本题如果不限制输出格式, 那么下面这段简单的输出就OK啦
// printf("%s %d\n", res, mod);
return 0;
}
void print (char arr[], int len, int mod) {
int i;
// 当出现0811, 这样的商, 也就0开头, 并且后面还有数
// 我们需要对输出做特殊处理, 就是手动用putchar输出,
// 跳过第0位, 也就是保存0的这一位
if (len >= 2 && (*arr == '0')) {
for (i=1; i<=len-1; i++) {
putchar(arr[i]);
}
printf(" %d\n", mod);
} else {
printf("%s %d\n", arr, mod);
}
}