1022 D进制的A+B
输入两个非负 10 进制整数 A 和 B (≤230 −1),输出 A+B 的 D (1<D≤10)进制数。
输入格式:
输入在一行中依次给出 3 个整数 A、B 和 D。
输出格式:
输出 A+B 的 D 进制数。
输入样例:
123 456 8
输出样例:
1103
思路:比较简单,只要解决了进制转换就解决了这道题。进制转换的基本方法是:
对于待转换数 sum,每次除以进制 d,得到商和余数,商作为新的 sum,余数保存至 ans[ ]
当 sum 为0时,终止操作,所得余数 ans[ ] 倒序输出,就是结果。
代码1采用了上述方法。
当然进制转换也有其它方法,可以利用枚举的思想,根据乘方确定D进制下每一位的数值。
如 579 转换到 8进制 为 1103
首先我们知道 1103 可还原为 1 x 83 + 1 x 82 + 0 x 81 + 3 x 80,
那么对于计算机来说,可以从最高位往后逐位尝试枚举。
即,
8的1次方、2次方、3次方都不大于579,而8的四次方大于579
所以8的3次方是最高位,则确定该数有四位,形式为 ????
1 x 83 < 579,而 2 x 83 > 579,故确定了 1???
579 - 1 x 83 = 67
1 x 82 < 67,而 2 x 82 > 67,故确定了 11??
同理剩余 67 - 1 x 82 = 3,容易确定 110?
剩下一位显然是3
最终确定得到1103
代码2利用了这种枚举的思想(易懂但效率不高)。
代码1
#include <stdio.h>
int main() {
int a, b, d, sum, i = -1, ans[32] = { 0 };
scanf("%d %d %d", &a, &b, &d);
sum = a + b;
do ans[++i] = sum % d; while (sum /= d);
for (; i >= 0; i--) printf("%d", ans[i]);
return 0;
}
代码2
#include <stdio.h>
#include <math.h>
int main() {
int a, b, d, sum, n, i;
scanf("%d %d %d", &a, &b, &d);
sum = a + b;
for (n = 1; pow(d, n) <= sum; n++); //中止时,说明D进制下正好n-1位
while (--n >= 0) { //从最高位最大数往后遍历确定各位值
for (i = d - 1; i * pow(d, n) > sum; i--); //每位数字由大到小尝试,比从小到大方便
printf("%d", i);
sum -= i * pow(d, n);
}
return 0;
}