C语言编程题(四)-- 进制转换

进制转换的普遍思路;

  • 如果需要将一个p进制转换成q进制,需要将该p进制数转换成十进制数,以其为媒介转化成其他进制的数。
  • 进制转换一般需要用到取余取低位,除法进行右移的操作。

1

在这里插入图片描述

分析

这是一道典型的进制转换类型的题,难点在于读取和输出的可能不是纯数字,会有‘A’,‘B’,
‘C’,'D’等字母。可以采用一次用scanf读取一个单词,然后逐字符转换成整型。输出时,需要将整型转换成字符。

#include<stdio.h>
#include <ctype.h>
#include <string.h>
#include <math.h>
char toChar(int);
int toNum(char);
int main()
{
    const int MAX = sizeof(long) * 8;  //long类型最多所占的位数
    int D1,D2; //当前读取数字的进制数   待转换成的进制数
    char input[MAX + 1];    //用于接收读入的数字
    char result[MAX];
    long num ;
    int i,len,count;
    while(scanf("%d%s%d",&D1,input,&D2) == 3){
        num = 0;
        count = 0;
        len = (int)strlen(input);
        for(i = 0;i < len;i++){
            num += toNum(input[len- 1 -i] ) * pow(D1,i);
        }
        do{
            result[count ++] = toChar(num % D2);
            num /= D2;
        }while (num);
        for(i = count - 1;i >= 0;i--)
        {
            printf("%c",result[i]);
        }
        putchar('\n');
    }
    return 0;
}
char toChar(int num)
{
    char ch;
    switch (num)
    {
        case 10:
            ch = 'A';
            break;
        case 11:
            ch = 'B';
            break;
        case 12:
            ch = 'C';
            break;
        case 13:
            ch = 'D';
            break;
        case 14:
            ch = 'E';
            break;
        case 15:
            ch = 'F';
            break;
        default:
            ch = num + '0';
    }
    return  ch;
}
int toNum(char ch){
    int num;
    ch = toupper(ch);
    switch (ch)
    {
        case 'A':
            num = 10;
            break;
        case 'B':
            num = 11;
            break;
        case 'C':
            num = 12;
            break;
        case 'D':
            num = 13;
            break;
        case 'E':
            num = 14;
            break;
        case 'F':
            num = 15;
            break;
        default:
            num = ch - '0';
    }
    return num;
}
Tips
  • 用到do while循环而不是while循环的原因是,假设输入的数据是0,那么while循环将不会进行,最后将什么也不会打印。do while保证了即使是0也会打印。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值