內容 :
一個「最約畢氏三角」( 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
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
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
原來跟三角函數沒什麼關係
題目看得有點久 ~.~
佑好,
回覆刪除1程式ok
2算互質的地方,可以用輾轉相除法,求最大公因數是否為1,會快些。
3在每一個對其它個的地方,有些不必要的迴圈,可以減少些,程式執行速度會快些。
arro好,
1程式ok
2輾轉相除法,用遞迴做,很有技術性。(雖然速度比較慢)
3function runs,並沒有傳傳回值,所以,不要用function而是用sub。
函數因為會傳回值,呼叫的方式是用x=runs(a,b)
副程式因為不會傳回值,呼叫的方式是 call runs(a,b)
4算平方和的根號那邊,用個變數給他,就不用算兩次了。