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);
    }
}

posted @ 2017-10-22 20:12  阿胜4K  阅读(627)  评论(0编辑  收藏  举报