2011年7月5日 星期二

求餘數

求餘數

求餘數對於會寫程式的人來說,是個簡單的問題,例如用VB 來求餘數時,可以用mod這個關鍵字來實作。但如果算式為R = B^P mod M 的型態,給B、P、及M,要算出餘數R,當B 或P 很大時,那就變得不簡單了。現在,請你設計一個程式,來解決上述這個不簡單的問題。

輸入說明:

第一行的數字,表示有幾個問題要求解,第二行開始的每一行,為一個獨立的問題。每一行包含三個數字,分別為B、P、及M,例如:10 2009 9 代表B=10、P=2009、M=9。所有數字均為正整數,其範圍屬於[1,100000]。

輸出說明:

對輸入的每個問題分別以一行輸出餘數R。

輸入範例:

2
10 2009 9
2 99 5

輸出範例:
1
3

6 則留言:

  1. 花一小時找規則:P
    不過B、P在大一點就溢位了

    Private Sub Form_Load()
    Dim B As Double
    Dim P As Long
    Dim M As Long
    Me.Hide
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Input #1, N
    For i = 1 To N

    Input #1, B, P, M
    ans = B
    For j = 1 To P - 1
    ans = (ans * B) Mod M
    Next j

    Print #2, ans

    Next i

    Close #2
    Close #1
    End
    End Sub


    in.txt
    2
    1234 3214 1234
    2 999 50

    out.txt
    0
    38

    回覆刪除
  2. 這題看似簡單 但是卡在溢位問題

    不然就是個輕而一舉的題目了

    回覆刪除
  3. 佑好,
    像這樣的題目,考的就是數學。
    你的程式似乎是ok的。
    但是,(又是但是,哈)
    ans = B 改成 ans = B mod m
    ans = (ans * B) Mod M 改成
    ans = (ans * ( B mod M)) mod M
    這樣的話,每次剩下的數字都很小,就不會溢位了。

    回覆刪除
  4. 熊掌好,

    小還要更小再拿去算XD
    很好懂~謝謝老師

    回覆刪除
  5. Private Sub Form_Load()
    Me.Hide
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2

    Dim B, P, M, Ans
    Input #1, ti
    For i = 1 To ti
    Input #1, B, P, M
    '10 2009 9
    k = B Mod M
    Ans = k
    For j = 1 To P - 1
    Ans = (Ans * k) Mod M
    Next

    Print #2, Ans
    Next

    Close
    Close
    End
    End Sub

    回覆刪除