输入两个非负 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<math.h>
using namespace std;
void toD(int S, int D);
int main()
{
int A, B,D;
cin >> A >> B>>D;
int S = A + B;
toD(S, D);
return 0;
}
void toD(int S,int D) {
int maxP=0;
for (int i = 0; i < 31; i++) {
if (pow(D, i) <= S && pow(D,i+1)>S) {
maxP = i;
break;
}
}
int *a = new int[maxP+1];
for (int i = 0; i <= maxP; i++)
a[i] = 0;
int yu = S;
for (int i = maxP; i >= 0; i--) {
if (yu > 0) {
for (int j = 0; j < D; j++) {
if ((yu - j * pow(D, i) >= 0 && yu - (j + 1)* pow(D, i) < 0)) {
a[i] = j;
yu -= j * pow(D, i);
}
}
}
}
for (int i = maxP; i >= 0; i--) {
cout << a[i];
}
}
网上看到这题有更简单的做法:
#include <iostream>
using namespace std;
int main() {
int a, b, d;
cin >> a >> b >> d;
int t = a + b;
if (t == 0) {
cout << 0;
return 0;
}
int s[100];
int i = 0;
while (t != 0) {
s[i++] = t % d;
t = t / d;
}
for (int j = i - 1; j >= 0; j--) {
cout << s[j];
}
return 0;
}
不过,这样只能计算D<=10的情况(也就是题目的要求)。