题目:
输入两个非负 10 进制整数 A 和 B (≤230−1),输出 A+B 的 D (1<D≤10)进制数。
输入格式:
输入在一行中依次给出 3 个整数 A、B 和 D。
输出格式:
输出 A+B 的 D 进制数。
输入样例:
123 456 8
输出样例:
1103
题解 :
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
long long a, b;
int d;
cin >> a >> b >> d;
vector<int> res1;
long long c = a + b;
int idx = 0;
//除基取余法
do {
int k = c % d;
res1.push_back(k);
c /= d;
} while (c != 0);
for (int i = res1.size() - 1; i >= 0; i--) {
cout << res1[i];
}
return 0;
}
1> 将P进制数x转换为十进制数y
对一个十进制的数y=d1d2...dn,它可以写成这个形式:
y=d1*10^n-1+d2*10^n-2+...+dn-1*10+dn
同样的如果P进制数x为a1a2...an,那么它写成下面这个形式之后使用十进制的加法和乘法,就可以转换为十进制数
y=a1*p^n-1+a2*p^n-2+...+an-1*p+an
而这个公式很容易通过循环实现:
int y = 0, product = 1; //product在循环中会不断乘p,得到1,p,p^2,p^3..
while (x != 0) {
y = y + (x % 10 * product); //x%10是为了每次获取x的个位数
x /= 10;
product *= p;
}
2> 将十进制数y转换为Q进制数z
采用除基取余法。
int z[40], num = 0; //数组z存放Q进制数y的每一位,num为位数
do {
z[num++] = y % q; //除基取余
y /= q;
} while (y != 0);
这样z数组从高位到低位即为Q进制z。
值得注意的是,代码中使用do while而不是while的原因是:如果十进制数y恰好等于0,那么使用while将直接跳出循环,导致结果出错(正确结果应当是数组z中存放了z[0]=0)。