# 进制转换
程序员文章站
2022-07-13 13:16:55
...
Problem Description
输入一个十进制数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
tips: 很多初学者觉得进制转换很难,其实在做这种进制转化算法没有思路的时候,离开键盘,拿出纸笔,也是一种很好的选择:
例子:以十进制转化为十进制为例(不要笑,只是展示下思路而已)
十进制整数 n
转换为的目标进制每一位数用 b[] 数组表示
n = 120; // r进制,现在r = 10;
b[0] = n % 10 (个位 = 0)
n = n / 10 (*n = 12)
b[1] = n % 10 (十位 = 2)
n = n/10 (*n = 1)
b[2] = n % 10 (百位 = 1)
n = n/10 (*n = 0)
OK!这样我们就似乎发现了一个规律:
int n; cin >> n;
int i = 0;
b[i++] = n % r; // 取现在数最低位存入数组
n /= r; // 干掉最低位,缩减位数
//若此时n不为0,就说明数还有没有处理的
// 然后接着处理
只要找到了十进制转十进制以下进制的算法,加个负号、提升进制到十进制以上也就简单了。
所以下面是C++参考代码:
#include<iostream>
using namespace std;
int main()
{
int n;
int r;
char a[7] = {'A', 'B', 'C', 'D', 'E', 'F'};
while (cin >> n >> r)
{
int b[33]; // 32位整数,就算全部变成二进制也没有33位;
bool flag = 0;
if (n < 0)
{
flag = 1; // 如果是负数就标志一下
n = abs(n);
}
b[0] = n%r;
n /= r;
int i = 1;
while (n != 0) // 只要还有数要处理就循环
{
int t = n%r;
b[i++] = t;
n /= r;
}
if (flag)
cout << '-';
for (int j = i-1; j>=0; j--)
{
if (b[j] >= 10)
cout << a[ b[j]-10 ];
else
cout << b[j];
}
cout << endl;
}
}
上一篇: phpExcel数据导入
下一篇: 进制转换