首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

HDU 2031 進制轉換:任意基數互轉(含負數處理)

     編輯:關於C語言

題目要求

將十進制整數 n 轉換為 m 進制(2 ≤ |m| ≤ 16?題目通常 m 為正,但代碼處理了符號)。輸出用 0-9, A-F 表示。多測試用例。

核心算法

  1. 處理符號:若 n、m 異號,輸出負號,後續用絕對值計算。
  2. 反覆取模:temp = n % m; temp = temp>0 ? temp : -temp; 確保餘數非負。
  3. 餘數 ≥ 10 輸出字母:'A' + temp - 10。
  4. 用棧(或字符數組逆序)輸出,因取模產生低位在前。
  5. n /= m 迭代至 0。

代碼實現

#include <iostream>
#include <stack>
using namespace std;

int main()
{
    int n, m;
    stack<char> st;
    while (cin >> n >> m) {
        int temp;
        if ((n < 0 && m > 0) || (n > 0 && m < 0))
            cout << "-";
        while (n) {
            temp = n % m;
            temp = temp > 0 ? temp : -temp;
            if (temp >= 10)
                st.push(temp - 10 + 'A');
            else
                st.push(temp + '0');
            n /= m;
        }
        while (!st.empty()) {
            cout << st.top(); st.pop();
        }
        cout << endl;
    }
    return 0;
}

關鍵點解析

  • 負數取模規則:C++ 中 -7 % 3 == -1,需手動修正為非負餘數(+m 或取絕對值)。代碼用 temp>0?temp:-temp 實現。
  • 符號分離:先輸出符號,後續按絕對值轉換,避免負數除法/取模的未定義行為差異。
  • 棧逆序:自然匹配「最後取模的最高位先輸出」。
  • 大寫字母:'A' + temp - 10 生成 'A'..'F'。

測試樣例

nm輸出說明
31161F標準十六進制
-3116-1F負數輸出負號
31-16-1F基數負數視為結果為負
02(空行?)代碼 while(n) 不進入,輸出空行;題目通常 n≠0

改進建議

  1. 處理 n=0 特例:直接輸出 0。
  2. 支持更大基數(如 36 進制 0-9, a-z)。
  3. 用字符數組 + 逆序替代 stack,減少 STL 開銷。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved