小紫書 習題2 5 分數化小數 decimal

2021-07-04 07:10:35 字數 1672 閱讀 4328

輸入正整數a,b,c,輸出a/b的小數形式,精確到小數點後c位,a,b<=10^6,c<=100。輸入包含多組資料,結束標記為a=b=c=0。

樣例輸入:

1 6 4

0 0 0

樣例輸出:

case 1: 0.1667

這個題要考慮的情況也不少,我覺得還是有點複雜的。求解過程就是模擬除法運算列豎式的那種過程。但是,小數點後要計算c+1位,四捨五入時用。

然後就是四捨五入問題,小數點後第c+1位是9的情況比較特殊,更特殊的就是第c位、c-1位、c-2位都是9,整數部分最後一位也是9,甚至是999.999這種,最高位就要補個1,其他的都變為0,所以,要把結果的第0位空出來(我的結果用陣列表示的)。然後大概就是這些吧。感覺沒什麼問題了。

**如下:

#include #include #include #include #include using namespace std;

int main()

int temp = 0, pos = 1;

ans[0] = '0';

for (int i = 0; a[i] != '\0'; i++)

ans[pos++] = '.';

for (int i = 0; i <= c; i++)

// char ans[128] = "0099.999999999";

// int pos = 12;

/* for (int t = pos - 1; t >= 0; t--)

//錯誤的四捨五入處理

*/int t = pos - 1;

// printf("未四捨五入前 ans is %s\n", ans);

// printf("pos is %d t is %d\n", pos, t);

if (ans[t] - '0' <= 4)

else if (ans[t - 1] <= '8')

else

/*if (ans[i - 2] - '0' >= 0 && ans[i - 2] - '0' <= 8)*/}

else if (ans[i - 1] - '0' >= 0 && ans[i - 1] - '0' <= 8)

}}// printf("表示式 %s\n", ans);

int findzero;

for (findzero = 0; findzero < 128 && ans[findzero + 1] != '.'&&ans[findzero] == '0'; findzero++);

/* bool f1, f2, f3;

for (findzero = 0;; findzero++)

//findzero的詳細情況

printf("f1 %d f2 %d f3 %d\n", f1, f2, f3);

*/// printf("findzero is %d\n", findzero);

// printf("%c\n", ans[findzero]);

printf("case %d: ", sky);

for (int i = findzero; ans[i] != '\0'; i++)

cout << endl;

}// system("pause");

return 0;

}

習題2 5 分數化小數

演算法競賽入門經典 第2版 第2章 迴圈結構程式設計 本章有兩個難題 習題2 4 子串行之和,習題2 5 分數化小數。習題2 5 分數化小數 訪問量如此之大,證明讀者有需求,並且之前寫的程式有瑕疵,處理不了進製問題,故決定重寫該題 2018 8 9 9 28 以下 為ac 完全符合題意的 可以應對測...

習題 2 5 分數化小數

模擬保留小數字的過程 思路 這道題主要要注意的是小數的位數需要人工輸入,就是模擬保留小數字的過程,具體的思路是先輸出整數字和小數點,小數字則通過上一次除后的所得餘數再除除數依次類推,到最後一位時要根據下一位的數值來判斷是否進製。這裡選擇題目的樣例就是1 6,輸出至小數點後4位數,先求出他們的商,既1...

2 5 分數化小數

輸入正整數a,b,c,輸出a b的小數形式,精確到小數點後c位。a,b 10 c 100。輸入包含多組資料,結束標記為a b c 0。樣例輸入 1 6 4 0 0 0 樣例輸出 case 1 0.1667 渣渣智本以為這道題很簡單,然而。如果很多很多很多小數點後的位數怎麼辦,也就是c,然後就找了很多...