题目描述
把一个整数的各位累加,NowCoder称它为“数位和”。例如正整数123456的数位和是1+2+3+4+5+6=21。现在,请你帮忙计算一个整数n在r进制下的数位和,并用相应的进制输出结果。
输入描述:
输入有多组数据。
每组数据包含两个正整数n (1≤n≤2147483647)和r (2≤n≤16)。
输出描述:
对应每一组数据,输出十进制正整数n转换成r进制后的数位和,并用r进制输出结果。
输入例子:
123456 10
123456 2
输出例子:
21
110
还是进制转换的题,这么多水题。。。
与上一题 PAT乙级(Basic Level)练习题 外星人的语言 几乎一毛一样。。。
#include <iostream>
#include <string>
using namespace std;
int main(int argc, const char * argv[]) {
int n = 0, r = 0;
//scanf返回值为正确输入数据的变量个数,当一个变量都没有成功获取数据时,此时返回-1
while (scanf("%d %d", &n, &r) != - 1) {
int resNum = 0;
string resStr = "";
//只要n!=0,则说明还需要进位转换
while (n != 0) {
//所有的余数即是进制转换后的结果
resNum += n % r;
n /= r;
}
//将resNum转换为r进制,可以封装成一个函数
while (resNum != 0) {
char ch = resNum % r;
//转换为响应的数字字符,超过10需要转成A、B、C等大写字母
if (ch > 9) {
ch += 'A' - 10;
} else {
ch += '0';
}
//逆序拼接,因为我们是从低到高位进行转换
resStr = ch + resStr;
resNum /= r;
}
//输出结果字符串
printf("%s\n", resStr.c_str());
}
return 0;
}