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、、、
- 要先进行取余操作,然后再算商,否则余数会少。
- 在循环结束后,虽然商为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;
}
更改过程
- 一开始准备使用数组存储余数,但是不确定余数个数,而且C++学的也不好,不怎么会用动态数组,就简化使用栈结构吧。
- 在进行计算的时候,先计算了商,后计算的余数,导致进制转化丢失最后一位。