[牛客習題]任意進制轉換

題目描述

給定一個十進制數M,以及需要轉換的進制數N。將十進制數M轉化爲N進制數

輸入描述:

輸入爲一行,M(32位整數)、N(2 ≤ N ≤ 16),以空格隔開。

輸出描述:

爲每個測試實例輸出轉換後的數,每個輸出佔一行。如果N大於9,則對應的數字規則參考16進制(比如,10用A表示,等等)
示例1

輸入: 7 2
輸出: 111

題目分析:

  • 本題是要進行進制轉換,根據輸入進制數將M (十進制數) 轉換爲N進制。這裏要注意負數的特殊處理。這裏要特別注意,給的輸入用例中沒有說明負數的輸出方式,如果是平時刷題,可能平臺還會給出未通過的測試用例,我們看完之後把代碼一修改就好了,但是筆試的時候未通過的測試用例不會給出,這就需要大家去猜測了,很磨人啊,所以各位還是要多刷題啊,才能見多識廣~~~
  • 這裏參考其他解題思路,採用一個string table來進行進制數輸出映射,按照字符串處理進行輸出比較方便。首先一進來我們要先判斷正負數。如果是負數就把他轉換爲正數處理標誌flag更改爲true;否則flag = false,表明它是正數。(這裏我是先不知道負數如何處理的,考慮負數是補碼存儲比較複雜,先按正數跑完代碼未通過的測試用例就告訴了負數的處理方式(輸入4 3, 輸出-11),從而可見他是直接先按正數處理,如果是負數就在前面添加‘-’就好好了)
  • 標識完正負數後,m%n和table之間進行映射,將結果放到字符串res中(res += table[m%n]);最後m進行更新(m /= n)。當m不爲0時循環繼續。
  • 最後根據flag值看是否需要加‘-’,由於我們計算數據時是從低位開始計算的,res中保存的的結果是逆序的,故我們翻轉整個字符串res就得到最終結果了。

代碼如下:

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main()
{
    string table = "0123456789ABCDEF", res;
    int m, n;
    cin >> m >> n;

    //標記負數,將負數轉換爲正數統一處理,最後根據標記輸出負數時加上‘-’號
    bool flag = false;
    if(m < 0)
    {
        flag = true;
        m = 0 - m;
    }

    while(m)
    {
        res += table[m%n];
        m /= n;
    }

    if(flag)
        res += '-';

    reverse(res.begin(), res.end());

    cout << res << endl;

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