题目
输入两个非负 10 进制整数 A
和 B
(≤230−1),输出 A+B
的 D
(1<D
≤10)进制数。
输入格式:
输入在一行中依次给出 3 个整数 A
、B
和 D
。
输出格式:
输出 A+B
的 D
进制数。
输入样例:
123 456 8
输出样例:
1103
思路
类似于手动计算二进制,将每一次求模的余数写入数组,然后再将数组倒序输出。
代码
#include<stdio.h>
#include<string.h>
int main()
{
int a = 0, b = 0, sum = 0, d = 0;
int n[32], i = 0;
scanf("%d%d%d", &a, &b, &d);
sum = a + b;
while(sum >= d)
{
n[i++] = sum % d;
sum /= d;
}
n[i] = sum;
while(i)
printf("%d", n[i--]);
printf("%d\n", n[0]);
return 0;
}
心得
一种很简洁的解法,参考自OliverLew
思路分析
比方说我们求 20 的二进制,先找出最接近的 20 的 2n ->也就是 24, 再找最接近 20 - 24 的 2n,一直到剩下 0 或 1。
代码
#include <stdio.h>
int main()
{
int A, B, D, Sum;
scanf("%d %d %d", &A, &B, &D);
Sum = A + B;
int power = 1;
while(Sum / D >= power) {
power *= D;
printf("power=%d\n", power); // 测试语句
}
for(; power > 0; Sum %= power, power /= D)
{
printf("Sum = %d power = %d\n", Sum, power);
printf("Sum/power = %d\n", Sum / power); // 测试语句
}
return 0;
}
输入:
123 456 8
输出:
123 456 8
power=8
power=64
power=512
Sum = 579 power = 512
Sum/power = 1
Sum = 67 power = 64
Sum/power = 1
Sum = 3 power = 8
Sum/power = 0
Sum = 3 power = 1
Sum/power = 3