PAT乙級1017

1017 A除以B (20分)

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

本題要求計算 A/B,其中 A 是不超過 1000 位的正整數,B 是 1 位正整數。你須要輸出商數 Q 和餘數 R,使得 A=B×Q+R 成立。app

輸入格式:

輸入在一行中依次給出 A 和 B,中間以 1 空格分隔。spa

輸出格式:

在一行中依次輸出 Q 和 R,中間以 1 空格分隔。code

輸入樣例

123456789050987654321 7ci

輸出樣例

17636684150141093474 3字符串

個人理解

A爲不超過1000位的正整數,不是不超過1000,是1000位。用string存儲,B是一位正整數,short便可。好像是大整數的除法問題的簡化,除數只有一位,循環遍歷A,將A中的字符轉化爲數值進行計算,將每次的商轉化爲字符串拼接,每次的餘數參與下一次的被除數。兩點注意。get

  1. 在循環遍歷時,有可能會出現餘數爲0的狀況,若是餘數爲0,則只有下一字符做爲被除數,例如321 / 3,第一步的商爲1,可是餘數爲0,下一步的被除數爲2。
  2. 最終的商可能出現以0開始的字符串,例如123 / 2,按照這種逐步計算相除的方式,商最後爲061,此時則須要將前面的0給去掉。

代碼段

#include <iostream>
#include <string>
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。
相關文章
相關標籤/搜索