c++實現大數進制轉換 (字符串模擬數字運算)


注:這個主要用於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;


}


其實別看十進制轉二進制如此,二進制轉十進制也是一樣的(盡管平時為了計算方便都是加法)

為了計算方便,這里的所有數字都用二進制表示


免責聲明!

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



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