輸入十進制數(如 -14.48、61.3585),要求輸出二進制表示(如 -1110.0111101011、111101.0101101111)。原代碼存在負數處理錯誤、小數精度不足、整數部分遞歸邏輯缺陷等問題。
#include <stdio.h>
#include <math.h> // 用於 fabs()
// 整數部分遞歸轉二進制
void printIntBinary(int n) {
if (n > 1) {
printIntBinary(n / 2);
}
printf("%d", n % 2);
}
// 小數部分迭代轉二進制,限制位數
void printFracBinary(double frac, int maxBits) {
if (maxBits <= 0 || frac == 0.0) return;
frac *= 2;
int bit = (int)frac;
printf("%d", bit);
printFracBinary(frac - bit, maxBits - 1);
}
int main() {
double num;
printf("請輸入一個十進制數: ");
if (scanf("%lf", &num) != 1) return 1;
// 處理負數
if (num < 0) {
printf("-");
num = fabs(num);
}
int intPart = (int)num;
double fracPart = num - intPart;
// 輸出整數部分
if (intPart == 0) {
printf("0");
} else {
printIntBinary(intPart);
}
// 輸出小數部分
if (fracPart > 1e-10) { // 避免浮點誤差
printf(".");
printFracBinary(fracPart, 16); // 輸出 16 位小數
}
printf("\n");
return 0;
}
| 原代碼問題 | 修正方案 |
|---|---|
| 負數直接轉換導致錯誤輸出 | 先輸出 '-', 再處理絕對值 |
| z21 遞歸參數 c 固定,精度不可控 | 增加 maxBits 參數控制小數位數 |
| float 精度不足導致誤差累積 | 改用 double 類型 |
| 整數部分遞歸基礎情況缺失 | 明確 n<=1 時直接輸出 |
| 未處理 0.0 輸入情況 | 顯式判斷 intPart==0 輸出 "0" |
輸入: 61.3585
輸出: 111101.01011011100010
輸入: -14.48
輸出: -1110.01111010111000
註:小數部分因二進制無法精確表示某些十進制小數,尾部會有微小誤差,屬正常現象。
long double 提高精度(視編譯器支持)。