欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

# 进制转换

程序员文章站 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;
    }
}
相关标签: acm 进制转换

上一篇: phpExcel数据导入

下一篇: 进制转换