实现各种进制转换(c++版)

Posted 三国小梦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现各种进制转换(c++版)相关的知识,希望对你有一定的参考价值。

前言

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

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

10÷2=5···0

5÷2=2···1

2÷2=1···0

1÷2=0···1

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

十进制->N进制

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

#include <iostream>
#include <cstdio>
#include <stack>
/*
 * 进制转换 10——>n(n<10)
 * */
using namespace std;

void ConvertT2N(int number,int n)
    stack<char> 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 <iostream>
#include <cstdio>
#include <stack>

using namespace std;

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

/*
 * 现在N可以取任意进制了
 * */
void ConvertT2N(int number,int n)
    stack<char> 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<iostream>
#include<cstdio>


using namespace std;
/*
 * 进制转换 N->10
 * */
// 先把字母转换成数字
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("%d\\n", number);


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

M进制转换为N进制

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

#include <iostream>
#include <cstdio>
#include <stack>
#include <string>
using namespace std;
/*
 * M进制转换成N进制
 * */
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<char> 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;

以上是关于实现各种进制转换(c++版)的主要内容,如果未能解决你的问题,请参考以下文章

在c++中编写一个程序实现进制转换。

任意进制之间的转换(C++实现)

算法(第4版) C++ 实现各种排序算法(未完成)

c++函数编程实现自然数的十进制、二进制、八进制、十六进制转换

C++中进制转换

入栈c++十进制转化其他进制