2011年10月12日 星期三

畢氏‧三角‧製造

內容 :

一個「最約畢氏三角」( primitive Pythagorean triangle) 的定義是指一個三角形滿足:三邊長a, b, c都是正整數且 a^2 + b^2 = c^2 ,以及比較短的兩邊長a, b的最大公因數為1。老國王想要教導小王子學習畢氏三角的精隨與奧妙,於是給了小王子一些不同長度的木棍,要他利用這些木棍製造出許多「最約畢氏三角」。因為製造材料的關係,這些木棍僅被拿來用在比較短的兩個邊上,而且由於使用工具切木棍太危險了,因此木棍必須被整根使用。比方說妳有兩根長度分別是3和4的木棍,就可以做出一個三邊邊長分別是3, 4, 5的畢氏三角。

現在小王子拿到了很多很多木棍,請你計算這些木棍最多可以製作多少個「最約畢氏三角」,注意每根木棍至多只能被用一次。

輸入說明 :

每個測資檔內含有多組測資。每組測資第一列有一個正整數N(1<=N<=200),接下來包含了N個正整數代表木棍長度,所有數字都介於1到999999之間。

輸出說明 :

對於每一組測試資料請輸出能拿來湊出的最多最約畢氏三角的數量。

範例輸入 :

9
3 4 4 3 11 5 12 9 4
4
20 21 3021 220
5
28 195 1035 21412 37995

範例輸出 :

3
2
2

3 則留言:

  1. Dim X()

    Private Sub Form_Load()
    Me.Hide
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Do While Not EOF(1)
    Input #1, n

    ReDim X(n)
    For i = 1 To n
    Input #1, A
    X(i) = Val(A)
    Next i


    ans = 0
    For i = 1 To n - 1
    For j = i + 1 To n
    If T(X(i), X(j)) = True And X(i) <> 0 And X(j) <> 0 Then
    z = (X(i) ^ 2 + X(j) ^ 2) ^ 0.5
    If z = Int(z) Then ans = ans + 1: X(i) = 0: X(j) = 0
    End If
    Next j
    Next i

    Print #2, ans

    Loop
    Close #2
    Close #1
    End
    End Sub

    Function T(ByVal A, ByVal B) '判斷是否有互質
    If A < B Then
    T = A
    A = B
    B = T
    End If

    P = True
    For i = 2 To A
    If A Mod i = 0 And B Mod i = 0 Then P = False
    Next i

    T = P
    End Function

    範例輸入 :

    9
    3 4 4 3 11 5 12 9 4
    4
    20 21 3021 220
    5
    28 195 1035 21412 37995

    範例輸出 :

    3
    2
    2

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


    Do While Not EOF(1)
    List1.Clear: ans = 0
    Input #1, n
    Line Input #1, m
    x = Split(m)

    Call A2

    Loop

    Close
    Close
    End
    End Sub







    Function Runs(AA, BB)

    If AA = BB Then
    RR = AA
    Else
    If AA > BB Then Call Runs(AA - BB, BB)
    If BB > AA Then Call Runs(AA, BB - AA)
    End If

    End Function


    Sub A2()


    For i = 0 To UBound(x) - 1
    For j = i + 1 To UBound(x)

    'MsgBox x(i) & " " & x(j) & "X" & i & " " & j

    If x(i) <> 0 And x(j) <> 0 Then Call Runs(Val(x(i)), Val(x(j)))
    If RR = 1 And (x(i) ^ 2 + x(j) ^ 2) ^ 0.5 = Int((x(i) ^ 2 + x(j) ^ 2) ^ 0.5) And x(i) <> 0 And x(j) <> 0 Then ans = ans + 1:: x(i) = 0: x(j) = 0

    Next j
    Next i

    Print #2, ans
    End Sub


    原來跟三角函數沒什麼關係
    題目看得有點久 ~.~

    回覆刪除
  3. 佑好,
    1程式ok
    2算互質的地方,可以用輾轉相除法,求最大公因數是否為1,會快些。
    3在每一個對其它個的地方,有些不必要的迴圈,可以減少些,程式執行速度會快些。

    arro好,
    1程式ok
    2輾轉相除法,用遞迴做,很有技術性。(雖然速度比較慢)
    3function runs,並沒有傳傳回值,所以,不要用function而是用sub。
    函數因為會傳回值,呼叫的方式是用x=runs(a,b)
    副程式因為不會傳回值,呼叫的方式是 call runs(a,b)
    4算平方和的根號那邊,用個變數給他,就不用算兩次了。

    回覆刪除