歷屆試題 小數第n位

2022-02-23 04:31:19 字數 1981 閱讀 5725

問題描述

我們知道,整數做除法時,有時得到有限小數,有時得到無限迴圈小數。

如果我們把有限小數的末尾加上無限多個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

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 }

下面的小demo是計算迴圈節的,根據上個**衍生出來的

1 #include2

using

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是所求的小數後位...