PAT乙级1017

1017 A除以B (20分)

题目地址:https://pintia.cn/problem-sets/994805260223102976/problems/994805305181847552

本题要求计算 A/B,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数。你需要输出商数 Q 和余数 R,使得 A=B×Q+R 成立。

输入格式:

输入在一行中依次给出 A 和 B,中间以 1 空格分隔。

输出格式:

在一行中依次输出 Q 和 R,中间以 1 空格分隔。

输入样例

123456789050987654321 7

输出样例

17636684150141093474 3

我的理解

A为不超过1000位的正整数,不是不超过1000,是1000位。用string存储,B是一位正整数,short即可。好像是大整数的除法问题的简化,除数只有一位,循环遍历A,将A中的字符转化为数值进行计算,将每次的商转化为字符串拼接,每次的余数参与下一次的被除数。两点注意。

  1. 在循环遍历时,有可能会出现余数为0的情况,如果余数为0,则只有下一字符作为被除数,例如321 / 3,第一步的商为1,但是余数为0,下一步的被除数为2。
  2. 最终的商可能出现以0开始的字符串,例如123 / 2,按照这种逐步计算相除的方式,商最后为061,此时则需要将前面的0给去掉。

代码段

#include 
#include 
using namespace std;
int main() {
    string A;
    string Q = "";
    // 被除数
    int m;
    // 除数
    short n;
    // 商
    int p = 0;
    // 余数
    int q = 0;
    cin >> A >> n;
    int limit = A.length();
    string::size_type sz;
    for (int i = 0; i < limit; i++) {
        // 被除数
        if (q == 0) {
            // 字符转数字
            m = (int)(A[i] - '0');
        } else {
            string temp = to_string(q).append(to_string(A[i] - '0'));
            m = stoi(temp, &sz);
        }
        p = m / n;
        q = m % n;
        Q.append(to_string(p));
    }
    // 处理商前面可能出现0的情况,以及避免商仅为0,例如 3 / 7
    if (Q.find_first_of('0') == 0 && Q.length() > 1) {
        Q.erase(0, 1);
    }
    cout << Q << " " << q << endl;
}

更改过程

  1. 字符转数字,以及商的拼接,因为没好好学C++,导致这个转化问题没少为难,使用to_string()的时候,怎么也没有想到to_string('1') 的返回值竟然会是其对应的ASCCI码值——49,难搞哦。既然是ASCCI码值,那就按照ASCCI码来计算吧,减去‘0’的值,即可与预期相符。
  2. 在去除商前缀为0的情况时,忽略了商为0的情况,例如,8 / 9,所以在去除0的同时要保证商字符串的长度大于1。

你可能感兴趣的:(PAT乙级1017)