又一版A+B [2008年浙江大学计算机及软件工程研究生机试真题]

题目描述:
输入两个不超过整型定义的非负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,程序也能正常工作。
本题在线测试入口

结束


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值