我們最常見的進(jìn)制轉(zhuǎn)換就是十進(jìn)制轉(zhuǎn)換為二進(jìn)制了,就是不停的作除法,取余數(shù)。
目前創(chuàng)新互聯(lián)已為上千的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、網(wǎng)站改版維護(hù)、企業(yè)網(wǎng)站設(shè)計、都江堰網(wǎng)站維護(hù)等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
例如:十進(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)制轉(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時,輸出也是0,否則輸入0時就卡那了
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;
}
但是上面的代碼是有一點小問題的,它只能轉(zhuǎn)換10以內(nèi)的進(jìn)制,也就是N必須小于10,否則就會出錯。例如十進(jìn)制轉(zhuǎn)換成十六進(jìn)制就會出錯。例如11轉(zhuǎn)換成十六進(jìn)制表示為b而不是11,因為當(dāng)表示十進(jìn)制以上的數(shù)時需要用到字母a,b,c,d等等。
所以需要在輸出的余數(shù)上面加加工一下,把大于10的數(shù)用字母表示。
改進(jìn)版代碼如下:
#include <iostream>
#include <cstdio>
#include <stack>
using namespace std;
// 把整數(shù)轉(zhuǎn)換成對應(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; //因為要存字母所以用char
if (number == 0) { //特殊情況,當(dāng)輸入是0時,輸出也是0,否則輸入0時就卡那了
s.push(0);
} else {
while (number) {
s.push(Int2Char(number % n)); //在余數(shù)入棧時加工一下,把int轉(zhuǎn)換成char
number /= 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;
}
會了十進(jìn)制轉(zhuǎn)換為N進(jìn)制,那么把N進(jìn)制轉(zhuǎn)換為十進(jìn)制倒著來就好了,不停的乘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;
}
上述前兩個都會了以后,實現(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時,輸出也是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進(jìn)制轉(zhuǎn)換成十進(jìn)制的數(shù)返回
// 再把該數(shù)轉(zhuǎn)換成N進(jìn)制
ConvertT2N(number, n);
}
return 0;
}
本文標(biāo)題:實現(xiàn)各種進(jìn)制轉(zhuǎn)換(c++版)
網(wǎng)頁URL:http://chinadenli.net/article4/dsogooe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動態(tài)網(wǎng)站、用戶體驗、網(wǎng)站改版、電子商務(wù)、網(wǎng)站內(nèi)鏈、微信公眾號
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)