PAT乙级1022

1022 D进制的A+B (20分)

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

输入两个非负 10 进制整数 A 和 B \((≤2^{30−1})\),输出 A+B 的 D (1<D≤10)进制数。

输入格式:

输入在一行中依次给出 3 个整数 A、B 和 D。

输出格式:

输出 A+B 的 D 进制数。

输入样例

123 456 8

输出样例

1103

我的理解

进制转换问题,将10进制数转化为D进制数,使用栈依次存储10进制数对D的余数,直到商为0为止。然后出栈即可。难得的一遍AC、、、

  1. 要先进行取余操作,然后再算商,否则余数会少。
  2. 在循环结束后,虽然商为0,此时也要记得把余数入栈。

代码段

#include <iostream>
#include <stack>
using namespace std;
int main() {
    long long A, B;
    short D;
    cin >> A >> B >> D;
    long long remainder = (A + B) % D;
    long long C = (A + B) / D;
    stack<long long> s;
    // 先进行求余,再计算商
    while (C != 0) {
        s.push(remainder);
        remainder = C % D;
        C /= D;
    }
    s.push(remainder);
    while (!s.empty()) {
        cout << s.top();
        s.pop();
    }
    cout << endl;
    return 0;
}

更改过程

  1. 一开始准备使用数组存储余数,但是不确定余数个数,而且C++学的也不好,不怎么会用动态数组,就简化使用栈结构吧。
  2. 在进行计算的时候,先计算了商,后计算的余数,导致进制转化丢失最后一位。
posted @ 2020-01-27 19:39  Another7  阅读(193)  评论(0编辑  收藏  举报