题目
输入一个十进制数N,将它转换成R进制数输出。
Input
输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16, R<>10)。
Output
为每个测试实例输出转换后的数,每个输出占一行。如果R大于10,则对应的数字规则参考16进制(比如,10用A表示,等等)。
Sample Input
7 2
23 12
-4 3
Sample Output
111
1B
-11
1、"除R取余,逆序排列"法
这种方法最为常见,原理参考百度百科进制转换
图片来自百度百科
AC代码:
#include <iostream>
using namespace std;
int main()
{
int N, R;
int m[40];
int id;
while (cin >> N >> R) {
if (N < 0) { //判断正负
cout << "-";
N = -N;
}
id = 0; //初始化id
while (N > 0) { //除R取余
id++;
m[id] = N % R;
N = N / R;
}
for (int i = id; i > 0; i--) { //逆序排列
if (m[i] >= 10)
cout << (char)(m[i] + 55); //m[i]+55代表了该数字对应大写字母的ASCII码
else
cout << m[i];
}
cout << endl;
}
return 0;
}
2、“_itoa_s函数”法(推荐)
关键函数:
_itoa_s((十进制数据),(字符型数组),(进制类型))
这个函数会将所给的十进制数据根据进制类型进行转换,并存入字符型数组(注意数组长度要足够大)中,由于转换后的字母都是小写,所以需要一个toupper函数进行转换
AC代码:
#include <iostream>
using namespace std;
int main()
{
int N, R;
char ch[40];
while (cin >> N >> R) {
if (N < 0) { //判断正负
cout << "-";
N = -N;
}
_itoa_s(N, ch, R); //进制转换
for (int i = 0; i < sizeof(ch); i++) { //小写变大写
ch[i] = toupper(ch[i]);
}
cout << ch << endl;
}
return 0;
}