題目描述
給定一個十進制數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;
}