《資訊奧賽一本通》1082:求小數的某一位
阿新 • • 發佈:2018-11-21
1082:求小數的某一位
時間限制: 1000 ms 記憶體限制: 65536 KB
【題目描述】
分數a/b化為小數後,小數點後第n位的數字是多少?
【輸入】
三個正整數a,b,n,相鄰兩個數之間用單個空格隔開。0<a<b<100,1≤n≤10000。
【輸出】
一個數字。
【輸入樣例】
1 2 1
【輸出樣例】
5
//1082:求小數的某一位 //這題可以反過來想,比如1/8=0.125, //1 8 1結果是1(1相當於1*10/8得到結果1.25的個位數), //1 8 2結果是2(2相當於1*10*10/8得到結果12.5的個位數), //1 8 3結果是5(5相當於1*10*10*10/8得到結果125的個位數)。 //for迴圈中,為什麼先a=a%b,再a=a*10,而不是隻寫一個a=a*10? //假設a/b的結果是一個無限不迴圈或無限迴圈小數,比如91/3的結果是30.3333……。 //假設求91/3的小數位第10000位,第1位小數是91*10/3的個位數,第2位是91*10*10/3的個位數…… //第n位是91* 10的n次方/3的各位數,當n>=64時,數字就已經超出現有的是資料範圍 //但我們發現,91/3的小數位和1/3(1為91除以3的餘數)的小數位, //以91/3為例,下一次計算時,通過a=a*10,a變為10,再通過a=a%b,a得1的值 //每次迴圈執行a=a%b,a=a*10可以確保a的範圍不會超出int型範圍 #include<iostream> #include<cstdio> #include<cmath> using namespace std; int main() { int n,a,b; double shan; cin>>a>>b>>n; for(int i=1;i<=n;i++) { a=a%b; a=a*10; } shan=floor(a*1.0/b); cout<<(int)shan%10<<endl; }