浅谈整数进制转换【cpp实现】

整数进制转化的三种情况(根据难度由易到难):

1、小整数的八进制、十进制、十六进制的相互转换;

2、小整数任意进制之间的相互转换;

3、大整数任意进制相互转换

第一种:小整数8、10、16进制转换

这种情况我们可以直接使用C语言自身的输入输出即可实现:

八进制: %o输入输出, 数字前缀0, 如int 015;(为十进制13)
十进制: %d输入输出, 可不加前缀
十六进制: %x或%X输入输出, 前缀0x或0X
(大写X输出的数字中字母为大写,反之为小写,据说较老的编译器不支持大写)

第二种: 整数之间任意进制转换(m进制转换为n进制, 2 <= n,m <= 36)

此类问题我们都可以通过将m进制数转换为十进制,然后将十进制转换为n进制数即可。

  • 题目:输入3个整数m、x、y,代表输入m进制数x,要求输出x的n进制

代码:

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

// 由于进制中可能会出现字母,因此用字符串读取数字
string n, m;
int x, y;

int getnum(char ch)
{
    //cout << '*' << ch-'0' << '\n';
    if(ch >= '0' && ch <= '9') return ch-'0';
    if(ch >= 'a' && ch <= 'z') return ch-'a'+10;
    if(ch >= 'A' && ch <= 'Z') return ch-'A'+10;
}

char getch(int num)
{
    if(num <= 9) return '0'+num;
    return 'a'+(num-10);
}

// 任意进制转换为10进制原理:
// 按照权重将数字逐位展开即可
int trans1(int x, string m)
{
    int ans = 0;

    for(int i = 0; i < m.size(); i ++)
        ans = ans * x + getnum(m[i]);
    return ans;
}

// 10进制转换为任意进制进制原理:
// 将十进制数不断对权重取模,最后倒序输出
string trans2(int t, int y)
{
    string ans = "";
    while(t) ans += getch(t%y), t /= y;
    reverse(ans.begin(), ans.end());
    return ans;
}

int main()
{
    cin >> x >> m >> y;

    int t = trans1(x, m); // x进制m转换为10进制

    n = trans2(t, y);     // 10进制t转换为y进制

    cout << n;
    return 0;
}


第三种:大整数进制转换

这种问题和第二种问题处理方式相似,需要改动的地方为m进制数改为10进制的时候会导致数据溢出,此时我们的中间结果也需要用字符串存储,那么我们面对的问题就是:如何用字符串进行取模取余和乘法操作

题解专栏 文章被收录于专栏

希望不断进步

全部评论

相关推荐

听说改名字就能收到offer哈:Radis写错了兄弟
点赞 评论 收藏
分享
11-27 12:36
已编辑
门头沟学院 前端工程师
Apries:这个阶段来说,很厉害很厉害了,不过写的简历确实不是很行,优势删掉吧,其他的还行
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务