有一個程式設計師住在一條街上,這條街上的房子都在路的同一邊且門牌號碼是從1-2-3-4-....連續下來。有一天晚上他牽著他的狗出門散步,出門之後往左邊走,因為溜狗有點無聊,所以她順便把經過的房子的門牌號碼都加起來。隔天晚上他又出門溜狗,但這一次她往右走並且也把經過的門牌號碼加起來。讓他很驚訝的是:這兩次的數字竟然一樣。
當然,這個巧合現象跟這條街共有幾間房子(n),以及他住在第幾間房子(k)有關係。請寫出一個程式找出前十個滿足這樣條件的數對(k,n)。在輸出中有前2個這樣的數對。
每一對數字k,n的長度均為10,向右靠齊。請將檔案輸出至"out.txt"。 ※此題無須"in.txt"
輸出範例:
6 8
35 49
出自 程式設計隊訓練教材 NO.34 門牌號碼
1.每一對數字k,n的長度均為10,向右靠齊。
回覆刪除這句話怎麼解釋呢?
因為看題目的輸出範例,看不出來。
2.這題似乎滿好玩的,可以從兩個地方下手,一個是先設定n間房子,再去找找這樣的n之中,有沒有一個1<=k<=n的數,是1+2+...+k-1 會等於 (k+1)+(k+2)+...+n,當然,這樣的k可能不存在,於是這個n就不是解答的n,繼續找下一個n。
3.還可以有另一種想法,先設定一個k,將1+2+...+k-1的值算出來sumk,再去將(k+1)+(K+2)+...如果小於sumk數,就繼續加,如果相等,就是找到一組k,n,如果大於sumk就表示這個k不符合題目的要求,往下找下一個k吧。
試試吧。
我以k前面之數合(梯形公式)依序減掉k後面之數,若總和<0 則換下一個判斷
回覆刪除目前困擾的是數字變大時k之前面總和會太大而卡住程式,以至於目前只能判斷出前面4對
這個問題該怎麼改進比較好呢
高仔好,
回覆刪除sumk前=k*(k-1)/2
sumk後=n*(n+1)/2-sumk前-k
sumk後=(k+1+n)*(n-k)/2
如果用暴力方式會太慢,就只好用數學公式去想了。
第二個想法是,
k-1,k-2,k-3,k-4,...
k+1,K+2,K+3,k+4,...
相差是2,4,6,8,10,...
不過,你也可以先將程式給post上來,大家看看囉。
還有,試著打電話給其它的隊員,試著前面的功課再試試,一次都沒試過就放棄是很可惜的哦。
又或者,你先將你找到的前四組解答給po上來看看。
暴力方法 ~ 4個位數 我家跑的有點慢 5個位數 當機==
回覆刪除Private Sub Form_Load()
Open App.Path & "out.txt" For Output As #1
For I = 8 To 999
For j = I \ 2 To I
x = j * (j - 1) \ 2
y = (j + 1 + I) * (I - j) \ 2
If x = y Then
Print #1, j, I
End If
Next j
Next I
Close #1
End Sub
作者已經移除這則留言。
回覆刪除要求出10個解的話,電腦可能會跑超久的~"~
回覆刪除Private Sub Form_Load()
Open App.Path & "\out.txt" For Output As #1
n = 1
m = 2
Do Until n > 10
For i = 1 To m
x = i * (i - 1) / 2
y = (i + 1 + m) * (m - i) / 2
If x = y Then
Print #1, i, m
n = n + 1
End If
Next i
m = m + 1
Loop
Close #1
End Sub
看來只好用之前講的第2種方法,
回覆刪除k之前和k之後的相差的和,會等於剩下的1到個數差的數字的和。
簡單講,
2+4+6+...+x
1+2+3+...+y
這兩個總和如果相等,就是找到一組k,n
k=y+x/2 +1
n=y+x+1
所以,只有兩個數列一直向前,
如果x的那個數列和比較小,就加x
如果y的那個數列和比較小,就加y
直到找到10組相等的。
一來,計算快些,二來,數字小些,應該可以算出答案吧。
再試試,預備選手們,加油。
Private Sub Form_Load()
回覆刪除Open App.Path & "/out.txt" For Output As #2
total = 0
For i = 6 To 1700
For j = i \ 2 To i - 1
sumR = 0
For k = 1 To i - j
sumR = sumR + 2 * k
Next k
For l = 1 To i - 2 * (i - j)
sumR = sumR - l
If sumR < 0 Then Exit For
Next l
If sumR = 0 Then
Print #2, j + 1, i + 1
total = total + 1
If total = 10 Then Exit Sub
End If
Next j
Next i
Close #2
End Sub
只印出
6 8
35 49
204 288
1189 1681
就卡住了= =
雖然還不太能理解k跟n是怎麼想出來的不過接下來試試老師的方法
看能否理清思緒摟
高仔好,
回覆刪除雖然我覺得你的
For k = 1 To i - j
sumR = sumR + 2 * k
Next k
這三行怪怪的,這個sumR在算什麼?
不過,你的方式,還是跟其它人的程式一樣,會對每個n一再的分解計算,所以會很慢。
試試我的方式吧。每個n都只做一次而已。
那其中的方式,有些像「輾轉相除法」的味道說。看了我都有些喜歡了。
Dim ans(10) As Integer
回覆刪除Dim ansK(10) As Integer
Private Sub Form_Load()
Open App.Path & "/out.txt" For Output As #2
n = 3
a = 1
Do
k = 1
Do
sumK1 = 0
sumK2 = 0
For i = k + 1 To n
sumK2 = sumK2 + i
Next i
For j = 1 To k - 1
sumK1 = sumK1 + j
Next j
If sumK1 = sumK2 Then
ansK(a) = k
Exit Do
Else
k = k + 1
End If
Loop Until k = n
If sumK1 = sumK2 Then
ans(a) = n
a = a + 1
End If
n = n + 1
Loop Until a = 11
For i = 1 To 10
Print #2, ansK(i), ans(i)
Next i
Close #2
End Sub
老師
我看不太懂題目的最後
每一對數字k,n的長度均為10,向右靠齊。
至於要跑到第十個的話,好像有點難@.@
我家電腦才跑到第五個就有點卡了...
Public Sub Form_Load()
回覆刪除Dim ans As Long
Dim an As String
Me.Hide
Open App.Path & "/in.txt" For Input As #1
Open App.Path & "/out.txt" For Output As #2
k = 6
For i = 8 To 10000
For j = k To i
m = (j - (i - j) - 1)
If j * m = j * m - ((1 + m) * m / 2) + Abs(((j + 1 + i) * (i - j)) / 2 - (j * m)) * 2 Then
Print j, i
k = k * 5: i = i * 5: j = j * 5
End If
Next j
Next i
Close #2
Close #1
End
End Sub
想好久 還是沒辦法....
1H 以上