2011藍橋杯【初賽試題】n進製小數
n進製小數
將任意十進製正小數分別轉換成2,3,4,5,6,7,8,9進製正小數,小數點後保留8位,並輸出。例如:若十進製小數為0.795,則輸出:
十進製正小數0.795000轉換成 2進製數為: 0.11001011
十進製正小數0.795000轉換成 3進製數為: 0.21011011
十進製正小數0.795000轉換成 4進製數為: 0.30232011
十進製正小數0.795000轉換成 5進製數為: 0.34414141
十進製正小數0.795000轉換成 6進製數為: 0.44341530
十進製正小數0.795000轉換成 7進製數為: 0.53645364
十進製正小數0.795000轉換成 8進製數為: 0.62702436
十進製正小數0.795000轉換成 9進製數為: 0.71348853
以下代碼提供了這個功能。其中,dTestNo表示待轉的十進製小數。iBase表示進製數。請填寫缺失的部分。
void fun(double dTestNo, int iBase)
{
int iT[8];
int iNo;
printf("十進製正小數%f 轉換成%d 進製數為: ",dTestNo, iBase);
for(iNo=0;iNo<8;iNo++)
{
dTestNo *= iBase;
iT[iNo] = _____________;
if(________) dTestNo -= iT[iNo];
}
printf("0.");
for(iNo=0; iNo<8; iNo++) printf("%d", iT[iNo]);
printf("\n");
}
思路:首先要了解“十進製數小數部分如何轉化成n進製數”
十進製數0.3轉化成二進製數的方法如下:
0.3×2=0.6……整數部分為0,記0;
0.6×2=1.2……整數部分為1,記1;
0.2×2=0.4……整數部分為0,記0;
0.4×2=0.8……整數部分為0,記0;
0.8×2=1.6……整數部分為1,記1; ...
那麼我們來看代碼:
void fun(double dTestNo, int iBase) { int iT[8]; int iNo; printf("十進製正小數 %f 轉換成 %d 進製數為: ",dTestNo, iBase); for(iNo=0;iNo<8;iNo++) { dTestNo *= iBase; iT[iNo] = (int) dTestNo ;//如上麵的計算方法,隻取整數部分 if(____dTestNo >1____) dTestNo -= iT[iNo]; //如果整數部分不是0而大於0,要去掉整數部分,因為下一次隻能計算小數部分 //再者想,本題是小數轉化為n進製,dTestNo就是個小數,憑這一點第二個空也應該轉化成小數了 } printf("0."); for(iNo=0; iNo<8; iNo++) printf("%d", iT[iNo]); printf("\n"); }
最後更新:2017-04-03 12:55:27