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

題目描述ios

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

輸入描述:測試

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

輸出描述:code

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

輸入: 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就獲得最終結果了。

代碼以下:string

#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;
}
相關文章
相關標籤/搜索