栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

使用c++实现各种进制之间的转换

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用c++实现各种进制之间的转换

前言

我们最常见的进制转换就是十进制转换为二进制了,就是不停的作除法,取余数。

例如:十进制的10转换为二进制

10÷2=5···0

5÷2=2···1

2÷2=1···0

1÷2=0···1

直到商为0,然后把余数倒着写,所以10的二进制表示为1010。

十进制->N进制

会了十进制转换为二进制,那么十进制转换为任意进制也就迎刃而解了,只要不停的除法和取余就好了。

#include 
#include 
#include 

using namespace std;

void ConvertT2N(int number,int n){
    stack s;
    if (number == 0) {  //特殊情况,当输入是0时,输出也是0,否则输入0时就卡那了
        s.push(0);
    } else {
        while (number) {
            s.push(number % n);
            number /= n;
        }
    }
    // 把栈中的余数输出
    while (!s.empty()) {
        printf("%d", s.top());
        s.pop();
    }
    printf("n");
}
int main(){
    int number;
    while (scanf("%d", &number) != EOF) {
        ConvertT2N(number, 2);
    }
    return 0;
}

但是上面的代码是有一点小问题的,它只能转换10以内的进制,也就是N必须小于10,否则就会出错。例如十进制转换成十六进制就会出错。例如11转换成十六进制表示为b而不是11,因为当表示十进制以上的数时需要用到字母a,b,c,d等等。

所以需要在输出的余数上面加加工一下,把大于10的数用字母表示。

改进版代码如下:

#include 
#include 
#include 

using namespace std;

// 把整数转换成对应进制的字符,例如10的十六进制中表示为A
char Int2Char(int target){
    if (target < 10) {
        return target + '0';
    } else {
        return target - 10 + 'A';
    }
}

void ConvertT2N(int number,int n){
    stack s;	//因为要存字母所以用char
    if (number == 0) {  //特殊情况,当输入是0时,输出也是0,否则输入0时就卡那了
        s.push(0);
    } else {
        while (number) {
            s.push(Int2Char(number % n));	//在余数入栈时加工一下,把int转换成char
            number /= n;
        }
    }
    // 把栈中的余数输出
    while (!s.empty()) {
        printf("%c", s.top());
        s.pop();
    }
    printf("n");
}
int main(){
    int number;
    while (scanf("%d", &number) != EOF) {
        ConvertT2N(number, 16);//把十进制转换为十六进制
    }
    return 0;
}
N进制转换成十进制

会了十进制转换为N进制,那么把N进制转换为十进制倒着来就好了,不停的乘N,加上余数。

例如:二进制的1010转换为十进制

0*2+1=1

1*2+0=2

2*2+1=5

5*2+0=10

#include
#include


using namespace std;

// 先把字母转换成数字
int Char2Int(char target) {
    if (target >= '0' && target <= '9') {
        return target - '0';
    } else {
        return target - 'A' + 10;
    }
}
void ConverM2T(string str,int m){
    int number = 0; //该数在10进制下的表示
    for (int i = 0; i < str.size(); ++i) {
        number *= m;
        number += Char2Int(str[i]);
    }
    printf("%dn", number);
}

int main(){
    string str;
    while (cin >> str) {
        ConverM2T(str,16);	//把十六进制转换为十进制
    }
    return 0;
}
M进制转换为N进制

上述前两个都会了以后,实现把M进制转换成N进制了,思路是先把M进制转换成十进制,然后再把十进制的数转换成N进制。

#include 
#include 
#include 
#include 
using namespace std;

int Char2Int(char target) {
    if (target >= '0' && target <= '9') {
        return target - '0';
    } else {
        return target - 'A' + 10;
    }
}
// M进制转换成十进制的数返回
int ConverM2T(string str,int m){
    int number = 0; //该数在10进制下的表示
    for (int i = 0; i < str.size(); ++i) {
        number *= m;
        number += Char2Int(str[i]);
    }
    return number;
}

char Int2Char(int target){
    if (target < 10) {
        return target + '0';
    } else {
        return target - 10 + 'a';
    }
}
//十进制转换成N进制
void ConvertT2N(int number,int n){
    stack s;
    while (number) {
        s.push(Int2Char(number % n));
        number /= n;
    }
    if (s.empty()) {    //当输入是0时,输出也是0
        printf("0");
    }
    while (!s.empty()) {
        printf("%c", s.top());
        s.pop();
    }
    printf("n");
}

int main(){
    int m,n;
    while (scanf("%d%d",&m,&n)!=EOF){
        string str;
        cin >> str;
        int number = ConverM2T(str, m);// M进制转换成十进制的数返回
        // 再把该数转换成N进制
        ConvertT2N(number, n);
    }
    return  0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/784333.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号