容易出錯的大數進制轉換

一開始做題的時候習慣性用int,沒考慮到溢出的問題。

遇到大數類型的題,其都是要通過string類型輸入進行轉換,要額外注意。

以前在做十進制和二進制轉換的時候,通常我們用餘數除2的方法,再將最後的字符串倒過來即可,但在大數情況下,我們不能用直接除2的方法。

回想我們小學的時候做除法算式的方法,舉例用173(二進制形式爲10101101)除以2,我們假設用字符串a存儲173,轉換成的10101101用字符串b存儲

  • 首先1/2,商爲0,餘數爲1,a[0]=0。
  • 餘數1落下,加上後一位變17,除以2等於8,餘數爲1,a[1]=8。
  • 餘數1落下,13除以2,商爲6,餘數爲1,a[2]=6。

好了,173的所有位都被訪問完了,第一輪結束,你可以看到最後的餘數結果爲1,實際上就是用我們的173除以2,得到結果是086,餘數爲1,那麼我們的b[0]可以存儲爲1,你這時可以發現其實我們還是在用我們習慣用的餘數除2法,接下來再用086除以2,往復循環即可。首位的0我們可以用判斷語句篩除,這樣這個循環的終止條件就是全部的位數都變爲0的時候。

對於M進制轉換到N進制的數,通用的模板是下面這個函數實現:

string convert(int m,string a,int n){
    string b;
    int l=a.size();//需要轉換的數字的長度
    int i=0;
    while(i<l){
        int k=0;
        for(int j=i;j<l;j++){
            
            a[j]=(a[j]-'0'+k*m)/n+'0';
            k=(a[j]-'0'+k*m)%n;
        }
        b=b+char(k+'0');
        while(a[i]=='0')i++;
    }
    reverse(b.begin(),b.end());
    return b;
}

最後不要忘記用reverse函數把字符串倒過來纔是最終結果(這也是我們用餘數除2法的時候要注意的)。

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