任意進制間的轉換

以下的c++代碼可以實現任意進制間的轉換;

思路:以十進制爲跳板,先將其他進制的數字轉換爲十進制,再將十進制轉換爲其他進制。

/*
*create by chenzj36 
*on 2018/8/1
*實現任意進制間的轉換
*/

#include<iostream>
using namespace std;

int int_pow(int x, int y) {//實現冪運算,<iostream>也提供pow()函數
	int result = 1;
	for (int i = 1 ; i <= y; i++) {
		result *= x;
	}
	return result;
}

void dtoo(int dnum, int jz) {//十進制轉其他任意進制
	char rnum[100];//利用字符數組存“數字”,按位處理更方便;
	int i=0, j;
	while (dnum >= jz) {//大於等於欲轉化的進制,繼續除,取餘。
		if (dnum%jz <= 9) {
			rnum[i++] = dnum % jz + '0';//數字轉換爲字符
		}
		else {
			rnum[i++] = dnum % jz - 10 + 'A';//大於等於10的部分,用大寫字母。
		}
		dnum = dnum / jz;//取完餘數,進行除法操作。
	}
	if (dnum%jz <= 9) {
		rnum[i++] = dnum + '0';
	}
	else {
		rnum[i++] = dnum - 10 + 'A';
	}
	cout << "轉換爲" << jz << "進制:";
	for (j = i-1; j >= 0; j--) {//將字符數組逆序輸出
		cout << rnum[j];
	}
	cout <<endl;
}
int otod(char onum[], int jz) {//其他進制轉十進制
	int n = 0;
	int res = 0;
	for (int i = 0; onum[i] != '\0'; i++) {//確定字符數組存儲的位數
		n++;
	}
	for (int i = 0; i < n; i++) {
		int bas;
		if (onum[i] >= 'A') {//將大寫字母轉爲數字
			bas = onum[i] - 'A' + 10;
		}
		else {//將“字符”轉“數字”
			bas = onum[i] - '0';
		}
		res += bas * int_pow(jz, n-i-1);//權值*位對應的大小
	}
	return res;//返回十進制的數
}

void main() {
	while (1) {
		int orin,jz1,jz2;
		char onum[100];
		cout << "請輸入要轉換的數字(字母大寫):";//輸入任意的“數”
		cin >> onum;
		cout << "請輸入原始數據的進制:";//確定上面數字的進制
		cin >> jz1;
		cout << "請輸入要轉換的進制:";//輸入要轉化的進制
		cin >> jz2;
		dtoo(otod(onum, jz1), jz2);//調用函數,實現進制轉換
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章