进制转换问题(摘自算法笔记)

日常生活中人们使用的数字一般都是 十进制,而计算机使用的进制是二进制, 另外还有八进制、十六进制以及各种数字的进制,那么这就会产生一个问题:对两个不同进制,应该如何进行相互转换呢?

对一个P进制的数,如果要转换为Q进制,需要分为两步:

1、将P进制数x转换为十进制数y


在这里插入图片描述

2、将十进制数y转换为Q进制数z

在这里插入图片描述

int z[40], num = 0;
do {
    z[num++] = y % Q;
    y = y / Q;
   } while(y != 0);

在这里插入图片描述

例题展示

题目描述

求任意两个不同进制非负整数的转换(2进制~16进制),所给整数在long所能表达的范围之内。
不同进制的表示符号为(0,1,…,9,a,b,…,f)或者(0,1,…,9,A,B,…,F)。

输入

输入只有一行,包含三个整数a,n,b。a表示其后的n 是a进制整数,b表示欲将a进制整数n转换成b进制整数。a,b是十进制整数,2 =< a,b <= 16。

输出

可能有多组测试数据,对于每组数据,输出包含一行,该行有一个整数为转换后的b进制数。输出时字母符号全部用大写表示,即(0,1,…,9,A,B,…,F)。

样例输入

4 123 10

样例输出

27

代码展示

#include<cstdio>
#include<cstring>
int toInt(char a)
{
    if(a >= '0' && a <= '9') return a - '0';
    else if(a >= 'a' && a <= 'f') return a - 'a' + 10; // 小写
    else return a - 'A' + 10; // 大写
}

char toChar(int x)
{
    if(x >= 0 && x <= 9) return '0' + x;
    else return 'A' + x - 10;
}

int main()
{
    int a, b; //a进制 b进制整数
    char s[50];

    while((scanf("%d%s%d", &a, s, &b) != EOF))
    {
        // 先转换为十进制
        int y = 0; // y存十进制数
        int product = 1; // product在循环中会不断乘P,得到1、P、P^2

        for(int i = strlen(s) - 1; i >= 0; i--) {
            y += toInt(s[i]) * product;
            product = product * a;
        }

        //再转换为b进制
        char ans[100], num = 0; // num为位数
        do
        {
            ans[num++] = toChar(y % b);
            y /= b;
        }
        while(y != 0);
        for(int i = num - 1; i >= 0; i--)
        {
            printf("%c", ans[i]);
        }
        printf("\n");
    }
}

小结

用字符串存储和表示不同进制的数(例如常用的十六进制数)。

猜你喜欢

转载自blog.csdn.net/luminouswithyou/article/details/88567046
今日推荐