使用c++实现各种进制之间的转换
前言
我們最常見(jiàn)的進(jìn)制轉(zhuǎn)換就是十進(jìn)制轉(zhuǎn)換為二進(jìn)制了,就是不停的作除法,取余數(shù)。
例如:十進(jìn)制的10轉(zhuǎn)換為二進(jìn)制
10÷2=5···0
5÷2=2···1
2÷2=1···0
1÷2=0···1
直到商為0,然后把余數(shù)倒著寫,所以10的二進(jìn)制表示為1010。
十進(jìn)制->N進(jìn)制
會(huì)了十進(jìn)制轉(zhuǎn)換為二進(jìn)制,那么十進(jìn)制轉(zhuǎn)換為任意進(jìn)制也就迎刃而解了,只要不停的除法和取余就好了。
#include <iostream> #include <cstdio> #include <stack> /** 進(jìn)制轉(zhuǎn)換 10——>n(n<10)* */ using namespace std;void ConvertT2N(int number,int n){stack<char> s;if (number == 0) { //特殊情況,當(dāng)輸入是0時(shí),輸出也是0,否則輸入0時(shí)就卡那了s.push(0);} else {while (number) {s.push(number % n);number /= n;}}// 把棧中的余數(shù)輸出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; }但是上面的代碼是有一點(diǎn)小問(wèn)題的,它只能轉(zhuǎn)換10以內(nèi)的進(jìn)制,也就是N必須小于10,否則就會(huì)出錯(cuò)。例如十進(jìn)制轉(zhuǎn)換成十六進(jìn)制就會(huì)出錯(cuò)。例如11轉(zhuǎn)換成十六進(jìn)制表示為b而不是11,因?yàn)楫?dāng)表示十進(jìn)制以上的數(shù)時(shí)需要用到字母a,b,c,d等等。
所以需要在輸出的余數(shù)上面加加工一下,把大于10的數(shù)用字母表示。
改進(jìn)版代碼如下:
#include <iostream> #include <cstdio> #include <stack>using namespace std;// 把整數(shù)轉(zhuǎn)換成對(duì)應(yīng)進(jìn)制的字符,例如10的十六進(jìn)制中表示為A char Int2Char(int target){if (target < 10) {return target + '0';} else {return target - 10 + 'A';} } /** 現(xiàn)在N可以取任意進(jìn)制了* */ void ConvertT2N(int number,int n){stack<char> s; //因?yàn)橐孀帜杆杂胏harif (number == 0) { //特殊情況,當(dāng)輸入是0時(shí),輸出也是0,否則輸入0時(shí)就卡那了s.push(0);} else {while (number) {s.push(Int2Char(number % n)); //在余數(shù)入棧時(shí)加工一下,把int轉(zhuǎn)換成charnumber /= n;}}// 把棧中的余數(shù)輸出while (!s.empty()) {printf("%c", s.top());s.pop();}printf("\n"); } int main(){int number;while (scanf("%d", &number) != EOF) {ConvertT2N(number, 16);//把十進(jìn)制轉(zhuǎn)換為十六進(jìn)制}return 0; }N進(jìn)制轉(zhuǎn)換成十進(jìn)制
會(huì)了十進(jìn)制轉(zhuǎn)換為N進(jìn)制,那么把N進(jìn)制轉(zhuǎn)換為十進(jìn)制倒著來(lái)就好了,不停的乘N,加上余數(shù)。
例如:二進(jìn)制的1010轉(zhuǎn)換為十進(jìn)制
0*2+1=1
1*2+0=2
2*2+1=5
5*2+0=10
#include<iostream> #include<cstdio>using namespace std; /** 進(jìn)制轉(zhuǎn)換 N->10* */ // 先把字母轉(zhuǎn)換成數(shù)字 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; //該數(shù)在10進(jìn)制下的表示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); //把十六進(jìn)制轉(zhuǎn)換為十進(jìn)制}return 0; }M進(jìn)制轉(zhuǎn)換為N進(jìn)制
上述前兩個(gè)都會(huì)了以后,實(shí)現(xiàn)把M進(jìn)制轉(zhuǎn)換成N進(jìn)制了,思路是先把M進(jìn)制轉(zhuǎn)換成十進(jìn)制,然后再把十進(jìn)制的數(shù)轉(zhuǎn)換成N進(jìn)制。
#include <iostream> #include <cstdio> #include <stack> #include <string> using namespace std; /** M進(jìn)制轉(zhuǎn)換成N進(jìn)制* */ int Char2Int(char target) {if (target >= '0' && target <= '9') {return target - '0';} else {return target - 'A' + 10;} } // M進(jìn)制轉(zhuǎn)換成十進(jìn)制的數(shù)返回 int ConverM2T(string str,int m){int number = 0; //該數(shù)在10進(jìn)制下的表示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';} } //十進(jìn)制轉(zhuǎn)換成N進(jìn)制 void ConvertT2N(int number,int n){stack<char> s;while (number) {s.push(Int2Char(number % n));number /= n;}if (s.empty()) { //當(dāng)輸入是0時(shí),輸出也是0printf("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進(jìn)制轉(zhuǎn)換成十進(jìn)制的數(shù)返回// 再把該數(shù)轉(zhuǎn)換成N進(jìn)制ConvertT2N(number, n);}return 0; }總結(jié)
以上是生活随笔為你收集整理的使用c++实现各种进制之间的转换的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Forth 系统实现
- 下一篇: s3c2440移植MQTT