將 32 位有號整數 N 轉換為基數 R (2≤R≤16, R≠10) 表示。支援負數輸出(前綴 -),10-15 用 A-F 表示。多組測試輸入至 EOF。
sign,將 N 取絕對值。N==0 直接輸出 0。digit = N % R; N /= R; 將餘數轉字元存入字元陣列。N==0 特判、字母數字映射('A'+digit-10)、逆序輸出邏輯。while(scanf(...)!=EOF && (m>=2 && m<=16)):若輸入非法 R 直接結束程式,建議改為跳過該行繼續處理。INT_MIN 絕對值溢位(-2147483648 無法用 int 表示正數),需用 long long 或無號運算。#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 大素數基數轉換)、大數計算器開發。
n==0 回溯時列印)