將非負整數十進制數轉換為二進制表示。例如輸入 13 輸出 1101。本文介紹遞迴法與迭代法兩種核心算法。
二進制轉換本質是「除 2 取餘,逆序排列」。遞迴自然契合此過程:
void dectobin(int n) {
if (n / 2 > 0) {
dectobin(n / 2); // 先處理高位
}
printf("%d", n % 2); // 輸出當前位
}
dectobin(13) → 13/2=6>0 → 調用 dectobin(6)dectobin(6) → 6/2=3>0 → 調用 dectobin(3)dectobin(3) → 3/2=1>0 → 調用 dectobin(1)dectobin(1) → 1/2=0 不遞迴 → 輸出 11(3%2)、0(6%2)、1(13%2) → 1101用陣列暫存餘數,最後逆序輸出:
int main() {
int i, x;
int a[1000]; // 足夠大,32位整數最多32位二進制
scanf("%d", &x);
for (i = 0; ; i++) {
a[i] = x % 2;
x /= 2;
if (x == 0) break;
}
for (; i >= 0; i--) {
printf("%d", a[i]);
}
printf("\n");
return 0;
}
| 維度 | 遞迴法 | 迭代法 |
|---|---|---|
| 代碼簡潔度 | 極高,無需額外變數 | 需陣列暫存 |
| 空間複雜度 | O(log n) 棧幀 | O(log n) 陣列 |
| 可讀性 | 符合數學定義直觀 | 過程導向易懂 |
| 適用場景 | 教學、位數較少 | 嵌入式、避免棧溢出 |
利用位運算更高效,無除法開銷:
void dectobin_bitwise(unsigned int n) {
if (n == 0) { printf("0"); return; }
// 找到最高位
int bits = 0;
for (int temp = n; temp > 0; temp >>= 1) bits++;
// 從高位到低位輸出
for (int i = bits - 1; i >= 0; i--) {
printf("%d", (n >> i) & 1);
}
}
n==0 直接輸出 0,否則無輸出。int a[64] 足夠安全。