[PAT乙级]1022 D进制的A+B (思路+精简代码)

1022 D进制的A+B

输入两个非负 10 进制整数 A 和 B (≤2​30 −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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NoobDream_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值