注:這個主要用於10進制及以下的相互轉換
進制轉換的實現與取余和取模相關:以十進制數173轉換為二進制10101101為例
我們可以看到轉換進制的具體流程就是對輸入的數對2取模得到1,再對其對2整除得到下一個待處理數,直到待處理的數變成0,便將剛才得到的余數逆序輸出。
那么觀察一下這里的2,其實就是二進制的基數2
看完這張圖,我們的腦海里應該有了大體結構,就是我們的程序輸入基數,輸入待處理的數字173,然后通過一個循環結構得到余數,和下一個待處理的數,循環終止的條件應該和0相關,最后再通過拼接字符串或者其他方式輸出我們的余數。
那么我們還沒有解決如何得到余數的問題,同樣以173除2為例
實現字符串的數字運算,其實和我們運算的過程一樣,從字符串第一位開始取每一位除以m,那么如果遇到有余數的怎么處理呢?在這里17除2余1,可以發現下一步是13除2,因此余數參與下一次運算的方式應該是1*10+str[i],str[i]是字符串的下一位,而10其實就取決於我們原來輸入數字的基數,這里是十進制。那么173%2的結果是多少呢,其實就是最后一步運算得到的余數1。
具體實現代碼如下:
#include<iostream>
#include<string>
#include <algorithm>
using namespace std;
string division(string str, int m, int n, int & remain){
string result = "";
int a;
remain = 0;
for(int i = 0; i < str.size(); i++){
a = (n * remain + (str[i] - '0'));
str[i] = a / m + '0';
remain = a % m;
}
//去掉多余的0 比如10/2=05
int pos = 0;
while(str[pos] == '0'){
pos++;
}
return str.substr(pos);
}
string conversion(string str, int m, int n){
string result = "";
char c;
int a;
//因為去掉了多余的0,所以終止條件是字符串為空 例:當上一步運算結果為"0"時,實際上返回的結果為""
while(str.size() != 0){
str = division(str, m , n,a);
result = char(a + '0') +result;
}
return result;
}
int main(){
string a,b;
// cout << division("173",2, 10);
// cout << conversion("10101101", 10, 2);
cin >> a;
b = conversion(a,2,10);
reverse(b.begin(), b.end());
a = conversion(b,10,2);
cout << a << endl;
}
其實別看十進制轉二進制如此,二進制轉十進制也是一樣的(盡管平時為了計算方便都是加法)
為了計算方便,這里的所有數字都用二進制表示