1022 D进制的A+B (20)(20 分)卡点分析

本题链接: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;
}

猜你喜欢

转载自blog.csdn.net/qq_37729102/article/details/81711371