本题链接:https://pintia.cn/problem-sets/994805260223102976/problems/994805299301433344
1022 D进制的A+B (20)(20 分)
输入两个非负10进制整数A和B(<=2^30^-1),输出A+B的D (1 < D <= 10)进制数。
输入格式:
输入在一行中依次给出3个整数A、B和D。
输出格式:
输出A+B的D进制数。
输入样例:
123 456 8
输出样例:
1103
分析:
首先看到输入数,想到其范围,题目给定每个输入数最多为2的30次-1,两个输入数相加,最多为2的32次-2,因输出位数最多的是二进制数,故输出最多32位。二进制数最多32位,那么十进制数必定小于32位,故数据类型用int即可。两数相加得和,定义一维数组存储需输出的各个位,使用循环,判定条件为和为0,循环体不断存储和对进制D求余的结果,然后除10。到这里,核心算法基本结束,但是题目有两个卡点,一个是对输出位数的考量,显然最多输出32位,而经反复测试,测试点2考察32位的输出。另一个是对0的情况的考察,即输入数的和为0,输出为0的情况,经反复测试,在测试点3。第1个卡点只需将存储数组的长度设定不小于32即可。第2个卡点需要作额外处理,可以在求和完后判定和是否为0,作相应输出并退出程序,也可以是改变用于存储数字的循环的结束条件,假设输入数和为C,进制为D,则结束条件为C/D>0,也即提前一次退出了,退出后存储C,此时数组下标(如果从0开始的话)等于输出位数-1,然后用循环输出即可。
代码:
#include<iostream>
using namespace std;
int main()
{
int A,B,C,D,num[31]={0},i=0;
cin>>A>>B>>D;
C=A+B;
while(C/D)//为了处理0的情况而提前退出
{
num[i++]=C%D;
C/=D;
}
num[i]=C;//此时i=位数-1
while(i>=0)
cout<<num[i--];
return 0;
}