进制转换(HDU)

  • 题目链接

  • 题目描述

    输入一个十进制数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
    
  • 分析

    本题就是一个进制转换的题目,如果是要转换为3进制,那么就和3取余,在除以3,再用商取余,记录余数再除以3依次类推,直到商为0,然后记录每一次取余的结果,在倒序输出比如15

    取余15 % 35 % 31 % 3
    余数021
    510

    在倒序输出就是120

    然后本题的难点,在于如何输出大于10进制的数,可以利用字符数组,将每一个余数+'0’转换为字符,然后比较如果等于58就将其转化为字符A,59为B依次类推进行赋值,因为9的ASCII码值为57。最后在倒序输出即可。

  • AC代码
    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
        int N, R;
        while (scanf("%d%d", &N, &R) != EOF)
        {
            char b[10001]  = {0};
            char ans[10001] = {0};
            int flag = 0;//标记是否小于0
            int cnt = 0;//标记数组大小
    
            if (N < 0)//如果小于0将其变为整数,并将flag赋值为1
            {
                N = -N;
                flag = 1;
            }
    
            while(N)
            {
                b[cnt] = N % R + '0';//加上字符零使之变成字符
                N /= R;
                if (b[cnt] == 58)//进行比较来输入字母A
                    b[cnt] = 'A';
                else if (b[cnt] == 59)
                    b[cnt] = 'B';
                else if (b[cnt] == 60)
                    b[cnt] = 'C';
                else if (b[cnt] == 61)
                    b[cnt] = 'D';
                else if (b[cnt] == 62)
                    b[cnt] = 'E';
                else if (b[cnt] == 63)
                    b[cnt] = 'F';
                cnt++;
            }
            
            for (int i = 0; i < cnt; i++)//进行倒序
                ans[i] = b[cnt - 1 - i];
            
            if (flag)//输出,如果小于0输出-%s,否则为%s
                printf("-%s\n", ans);
            else
                printf("%s\n", ans);
        }
        return 0;
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值