浅谈整数进制转换【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进制的时候会导致数据溢出,此时我们的中间结果也需要用字符串存储,那么我们面对的问题就是:如何用字符串进行取模取余和乘法操作
题解专栏 文章被收录于专栏
希望不断进步