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

C語言進制轉換完全指南:任意基數(2-16)互轉實現

     編輯:關於C語言

問題需求

將 32 位有號整數 N 轉換為基數 R (2≤R≤16, R≠10) 表示。支援負數輸出(前綴 -),10-15 用 A-F 表示。多組測試輸入至 EOF。

核心算法:「除基取餘,逆序輸出」

  1. 處理符號:記錄 sign,將 N 取絕對值。
  2. 特殊情況 N==0 直接輸出 0。
  3. 迴圈:digit = N % R; N /= R; 將餘數轉字元存入字元陣列。
  4. 逆序列印字元陣列,前綴負號(如需要)。

原始代碼關鍵點與改進

✅ 正確處理

  • 負數轉正處理、N==0 特判、字母數字映射('A'+digit-10)、逆序輸出邏輯。

⚠️ 潛在問題

  • while(scanf(...)!=EOF && (m>=2 && m<=16)):若輸入非法 R 直接結束程式,建議改為跳過該行繼續處理。
  • 字元陣列大小 1001 足夠 32 位二進位(32 位),但未考慮 INT_MIN 絕對值溢位(-2147483648 無法用 int 表示正數),需用 long long 或無號運算。

健壯版實現(修正 INT_MIN 溢位、輸入容錯)

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

void convert_base(long long n, int base) {
    if (base < 2 || base > 16) return;
    char buf[64];
    int idx = 0;
    bool neg = false;

    if (n == 0) { putchar('0'); putchar('\n'); return; }
    if (n < 0) { neg = true; n = -n; } // long long 可容納 -LLONG_MIN

    while (n > 0) {
        int d = n % base;
        buf[idx++] = (d < 10) ? '0' + d : 'A' + d - 10;
        n /= base;
    }
    if (neg) putchar('-');
    while (idx--) putchar(buf[idx]);
    putchar('\n');
}

int main() {
    long long n; int r;
    while (scanf("%lld %d", &n, &r) == 2) {
        if (r < 2 || r > 16 || r == 10) continue; // 跳過非法基數
        convert_base(n, r);
    }
    return 0;
}

進階擴展:任意精度大整數轉換

若 N 超過 64 位,可用字串模擬大整數除法:

// 高精度除法:字串 / int -> 商字串 + 餘數
void div_string(const char *num, int base, char *quot, int *rem) { ... }

應用場景:加密算法(RSA 大素數基數轉換)、大數計算器開發。

常見面試追問

  1. 如何不使用除法/取模實現進制轉換?(位運算:基數為 2 的冪次時用移位與掩碼)
  2. 遞歸實現逆序輸出如何寫?(遞歸到 n==0 回溯時列印)
  3. 浮點數轉二進位如何處理?(整數部分除基,小數部分乘基取整)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved