輸入正整數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,然後就找了很多...