閱讀525 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go 更相損減法和輾轉相除法 求最大公約數和最小公倍數(C語言)
  下一篇:go Android Fragment中監聽事件