• 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; // 结果字符串长度(最后一位存储'')
        int now; // 每一次的商
        char *ptr;
    
        ptr = a;
        scanf("%s %d", a, &b);
    
        // 每次都拿到结果和余数
        while (*ptr != '') {
            // 想象一下草稿纸算除法, 每次"剩下"的数, 都是当前数+上一位的余数*10
            // 余数为零也不例外, 像这样 a[i] + 0 * 10
            now = (int)(*ptr - '0') + (mod * 10);
            res[len] = (char)((now / b) + '0');
            len++;
            mod = now % b;
            ptr++;
        }
        res[len] = ''; // 指向结果字符串最后一位 ''
        print(res, len, mod);
    
        // 本题如果不限制输出格式, 那么下面这段简单的输出就OK啦
        // printf("%s %d
    ", 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
    ", mod);
        } else {
            printf("%s %d
    ", arr, mod);
        }
    }
    
    
  • 相关阅读:
    OpenWrt配置绿联的usb转Ethernet网口驱动
    SQL_wm_concat函数实验:实现字段合并
    BingMap频繁Add Pushpin和Delete Pushpin会导致内存泄露
    比較C++和Java 二
    【JAVASE】Java同一时候抛出多个异常
    uva 1463
    Android 撕衣服(刮刮乐游戏)
    轻松掌握一致性哈希算法
    Oracle之sql语句优化
    Eclipse导出Library
  • 原文地址:https://www.cnblogs.com/asheng2016/p/7711408.html
Copyright © 2020-2023  润新知