题目描述:
输入两个不超过整型定义的非负10进制整数A和B(<= 2 31 2^{31} 231-1),输出A+B的m (1 < m <10)进制数。
输入描述:
输入格式:测试输入包含若干测试用例。每个测试用例占一行,给出m和A,B的值。
当m为0时输入结束。
输出描述:
输出格式:每个测试用例的输出占一行,输出A+B的m进制数。
样例输入:
8 1300 48
2 1 7
0
样例输出:
2504
1000
解题思路: 声明一个数组,用以保存相加结果的对应的进制表达,采用对m取模,再除m,不断循环,直到相加结果为0停止循环。最后,从后往前遍历数组输出。
#include<bits/stdc++.h>
using namespace std;
int main(){
long long a, b;//使用long long 确保不会溢出
int m;
while(scanf("%d", &m)!=EOF && m!=0){
if(m==0) break;
scanf("%lld%lld", &a, &b); //用%lld对long long变量赋值
a = a + b;//计算a+b
int ans[50], size = 0;//ans用来保存依次转换得到的各个数位数字的值,size表示其个数
do{//依次求各个数位上的数字值
ans[size++] = a%m;//对m求模
a /= m; //除m
} while(a!=0);//当a不为0时重复该过程
for(int i=size-1; i>=0; i--){
cout << ans[i];
} //输出,注意顺序为从高位到低位
cout << endl;//输出换行
}
return 0;
}
注意: 代码中使用了long long 数据类型,其数字取值范围为
−
2
63
-2^{63}
−263-1~
2
63
2^{63}
263-1。本例中,虽然规定了(<=
2
31
2^{31}
231-1),但两个Int值相加的最大的结果是超过int类型的数值范围的。输入输出的转义字符应使用%lld
。另一个注意点是,使用do while循环是保证即使被转换的数值为0,程序也能正常工作。
本题在线测试入口