2010年1月24日 星期日

2010/01/25 門牌號碼

        有一個程式設計師住在一條街上,這條街上的房子都在路的同一邊且門牌號碼是從1-2-3-4-....連續下來。有一天晚上他牽著他的狗出門散步,出門之後往左邊走,因為溜狗有點無聊,所以她順便把經過的房子的門牌號碼都加起來。隔天晚上他又出門溜狗,但這一次她往右走並且也把經過的門牌號碼加起來。讓他很驚訝的是:這兩次的數字竟然一樣。
當然,這個巧合現象跟這條街共有幾間房子(n),以及他住在第幾間房子(k)有關係。請寫出一個程式找出前十個滿足這樣條件的數對(k,n)。在輸出中有前2個這樣的數對。
每一對數字k,n的長度均為10,向右靠齊。請將檔案輸出至"out.txt"。 ※此題無須"in.txt"

輸出範例:
6  8
35  49

出自  程式設計隊訓練教材 NO.34 門牌號碼

11 則留言:

  1. 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吧。
    試試吧。

    回覆刪除
  2. 我以k前面之數合(梯形公式)依序減掉k後面之數,若總和<0 則換下一個判斷
    目前困擾的是數字變大時k之前面總和會太大而卡住程式,以至於目前只能判斷出前面4對
    這個問題該怎麼改進比較好呢

    回覆刪除
  3. 高仔好,
    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. 暴力方法 ~ 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

    回覆刪除
  5. 要求出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

    回覆刪除
  6. 看來只好用之前講的第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組相等的。
    一來,計算快些,二來,數字小些,應該可以算出答案吧。
    再試試,預備選手們,加油。

    回覆刪除
  7. 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是怎麼想出來的不過接下來試試老師的方法
    看能否理清思緒摟

    回覆刪除
  8. 高仔好,
    雖然我覺得你的
    For k = 1 To i - j
    sumR = sumR + 2 * k
    Next k
    這三行怪怪的,這個sumR在算什麼?
    不過,你的方式,還是跟其它人的程式一樣,會對每個n一再的分解計算,所以會很慢。
    試試我的方式吧。每個n都只做一次而已。
    那其中的方式,有些像「輾轉相除法」的味道說。看了我都有些喜歡了。

    回覆刪除
  9. 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,向右靠齊。
    至於要跑到第十個的話,好像有點難@.@
    我家電腦才跑到第五個就有點卡了...

    回覆刪除
  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 以上

    回覆刪除