問題描述
我們知道,整數做除法時,有時得到有限小數,有時得到無限迴圈小數。
如果我們把有限小數的末尾加上無限多個0,它們就有了統一的形式。
本題的任務是:在上面的約定下,求整數除法小數點後的第n位開始的3位數。
輸入格式
一行三個整數:a b n,用空格分開。a是被除數,b是除數,n是所求的小數後位置(0輸出格式
一行3位數字,表示:a除以b,小數後第n位開始的3位數字。
樣例輸入
1 8 1
樣例輸出
125樣例輸入
1 8 3
樣例輸出
500樣例輸入
282866 999000 6
樣例輸出
914思路:我們以3/7舉例,下面是手寫的常規除法的計算過程。
比如n=4時,我們計算的是小數第四位,那麼很明顯就是40除於7的值,所以我們只需要知道第四位小數對應的哪個被除數是誰就行,用變數sa表示被除數,則第一位小數就是sa/7,餘數就是下乙個小數對應的被除數,那麼用餘數更新sa,一次類推可以計算出所有的小數,注意上圖第乙個被除數30如果在下面再次出現則容易知道接下來會重複計算,意味著產生迴圈節,所以我們可以通過迴圈節長度更新n,降低時間複雜度。
**
1 #include2但是仔細一想上個**其實是不完全正確的,或不完美的,雖然可以通過測試系統,因為上個**預設迴圈節的第乙個數字就是小數點後的第乙個數字,但是很許多迴圈小數並非如此3using
namespace
std;45
intmain()618
}19for(int i=1;i<=3;i++)
23return0;
24 }
這是第三個測試用例相除的結果,發現迴圈節是149,從第四個數字開始,如果我們要查詢結果數億之後的某個數的後三位,上個**明顯超時,所以需考慮迴圈節不在第一位的情況,
在上個**上修改如下
1 #include2下面的小demo是計算迴圈節的,根據上個**衍生出來的using
namespace
std;
3int t=1;4
int array[10];5
int compare(int m)//
得到迴圈節開始的下標611
return0;
12}13int
main()
1433
if(num!=0&&m!=1)39
//if(nu)40}
41for(int i=1;i<=3;i++)
45return0;
46 }
1 #include2using
namespace
std;
3int t=1;4
int array[100];5
int compare(int m)//
得到迴圈節開始的下標611
return0;
12}13int
main()
1424
if(i!=1) array[t++]=sa%b;
25if(i==1) array[t++]=sa;
26 sa=sa%b*10;27
int aa=sa%b;
28 num=compare(aa);
29if(num!=0) break;30
31}32if(t==1000) cout << "
不存在迴圈節
"<
33else39}
40return0;
41 }
歷屆試題 小數第n位
問題描述 我們知道,整數做除法時,有時得到有限小數,有時得到無限迴圈小數。如果我們把有限小數的末尾加上無限多個0,它們就有了統一的形式。本題的任務是 在上面的約定下,求整數除法小數點後的第n位開始的3位數。輸入格式 一行三個整數 a b n,用空格分開。a是被除數,b是除數,n是所求的小數後位置 0...
歷屆試題 小數第n位
問題描述 我們知道,整數做除法時,有時得到有限小數,有時得到無限迴圈小數。如果我們把有限小數的末尾加上無限多個0,它們就有了統一的形式。本題的任務是 在上面的約定下,求整數除法小數點後的第n位開始的3位數。輸入格式 一行三個整數 a b n,用空格分開。a是被除數,b是除數,n是所求的小數後位置 0...
歷屆試題 小數第n位
題目 問題描述 我們知道,整數做除法時,有時得到有限小數,有時得到無限迴圈小數。如果我們把有限小數的末尾加上無限多個0,它們就有了統一的形式。本題的任務是 在上面的約定下,求整數除法小數點後的第n位開始的3位數。輸入格式 一行三個整數 a b n,用空格分開。a是被除數,b是除數,n是所求的小數後位...