HD 2031 进制转换

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

解题思路:

(1)将十进制数n转换为r进制数的方法是,n除以r取余数作为转换后的数的最低位。若商不为0,则商继续除以r,取余数做最低位,直到商为0为止。 其中,对于16进制大于9的六个数用A、B、C、D、E、F表示。

(2)如果使用递归,则求得的余数序列为从高到低,直接输出即可。如果不使用递归,则余数的存储序列为从低到高,输出时需注意反向输出。

(3)遇到负数时,先将其转化为正数,再进行进制转换,输出时不要忘记输出负号“-”。

下面的代码我们使用了递归:

#include <cstdio>
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;

int cnt=0;        //用来记录每一个进制存放的位置
int num[20];     //用来存放每一个进制的数

void fun(int a,int b)
{
    if(a == 0)    //递归的终止条件
        return ;
    fun(a/b,b);   //顺序递归
    num[cnt++] = a%b;   //逆序递归
}

int main()
{
    int N,R;
    char c;
    while(cin>>N>>R)
    {
        if (N<0)
        {
            N = -N;
            fun (N,R);
            cout<<"-";
            for (int i = 0; i < cnt; i++)
            {
                if (num[i] < 10)
                    cout<<num[i];
                else
                {
                    c = num[i]+'A'-10;
                    cout<<c;
                }

            }
        }
        else
        {
            fun (N,R);
            for (int i = 0; i < cnt; i++)
            {
                if (num[i] < 10)
                    cout<<num[i];
                else
                {
                    c = num[i]+'A'-10;
                    cout<<c;
                }
            }
        }
        cout<<endl;
        cnt = 0;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sxzsoon/article/details/81076810
HD