實現各種進制轉換(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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM