一個九位數由1-9數字組成並前N 位被N整除

 

題目:

請將123456789九個數字以特定的順序排列,組成一個9位數ABCDEFGHI(每個數字只能使用一次),使得:
1.第一位數字組成的整數可以被1整除
2.第一、二位數字組成的整數可以被2整除
3.第一、二、三位數字組成的整數可以被3整除
4.第一、二、三、四位數字組成的整數可以被4整除
......
9.第一、二、三...九位數字組成的整數可以被9整除

 

 

分析:

通常想法是遍歷9!=362280種排列。

其實第5位E一定是5,這樣可縮減到8!=40320種排列

進一步分析,偶數位一定是偶數(BDFH={2,4,6,8}),奇數位一定是奇數(ACGI={1,3,7,9}),因而只需分析P(4,4)*P(4,4)=576種排列。

繼續分析,4能整除 10*C+D,故D=2  或 6, 加之8能整除 10*G+H,故D,H={2,6},所以B,F={4,8},故需分析P(4,4)*P(2,2)*P(2,2)=48種排列

接着分析,3 能整除 100* D+ 10 * 5+ F,所以DEF={258 ,654},ABC,GHI能被3整除

如果DEF=258,則,ABC={147,741},GHI={369,963},但1472589,7412589均不能被7整除,不符合條件,故DEF=654,

B=8,H=2.此時只有P(4,4)=24種排列

又7能整除A8C654G,故7整除(A+4C+G),而G={3,7},如果G=3,ABC爲{189,789,981,987}均不滿足條件,故G=7,此時ABC={183,189,381,981}中只有381符合條件,故ABCDEFGHI=381654729

 

此時如果需要寫代碼,一句就夠了:

 

Debug.print 381654729

 

附幾種解法:

 

yier_fang 提供

  1. Sub cnft()
  2.     '定義一個數組
  3.     Dim a
  4.     '定義字符串
  5.     Dim strNums As String
  6.     strNums = "1,2,3,4,5,6,7,8,9"
  7.     '開始循環
  8.     Dim i, j, k As Integer
  9.     For i = 2 To 9
  10.         a = Split(strNums, ",")
  11.         strNums = ""
  12.         For k = 0 To UBound(a)
  13.             For j = 1 To 9
  14.                 If (a(k) & j) Mod i = 0 Then
  15.                     If InStr(a(k), j) = 0 Then
  16.                         strNums = strNums & "," & a(k) & j
  17.                     End If
  18.                 End If
  19.             Next j
  20.         Next k
  21.         strNums = Right(strNums, Len(strNums) - 1)
  22.     Next i
  23.     Erase a
  24.     
  25.     MsgBox ("運行結果爲:" & strNums)
  26. End Sub

代碼2:

 

IP zhang5382 提供)

  1. Sub Getit()
  2. Dim a, b, c, d, e, f, g, h, i As Integer, num1, num2 As String, x As Double
  3. e = 5: num1 = "123456789": num2 = "此數爲:": t = Timer
  4. For a = 1 To 9 Step 2
  5.     If a = e Then GoTo 10
  6.     For b = 2 To 8 Step 2
  7.         For c = 1 To 9 Step 2
  8.             x = a + b + c
  9.             If c = a Or c = e Or Int(x / 3) <> x / 3 Then GoTo 30
  10.             For d = 2 To 8 Step 2
  11.                 x = 10 * c + d
  12.                 If d = b Or Int(x / 4) <> x / 4 Then GoTo 40
  13.                 For f = 2 To 8 Step 2
  14.                     x = d + e + f
  15.                     If f = b Or f = d Or Int(x / 3) <> x / 3 Then GoTo 60
  16.                     For g = 1 To 9 Step 2
  17.                         x = a * 1000000 + b * 100000 + c * 10000 + d * 1000 + e * 100 + f * 10 + g
  18.                         If g = a Or g = c Or g = e Or Int(x / 7) <> x / 7 Then GoTo 70
  19.                         For h = 2 To 8 Step 2
  20.                             x = 10 * g + h
  21.                             If h = b Or h = d Or h = f Or Int(x / 8) <> x / 8 Then GoTo 80
  22.                             For i = 1 To 9 Step 2
  23.                                 If i = a Or i = c Or i = e Or i = g Then GoTo 90
  24.                                 num2 = num2 + Mid(num1, a, 1) + Mid(num1, b, 1) + Mid(num1, c, 1)
  25.                                 num2 = num2 + Mid(num1, d, 1) + Mid(num1, e, 1) + Mid(num1, f, 1)
  26.                                 num2 = num2 + Mid(num1, g, 1) + Mid(num1, h, 1) + Mid(num1, i, 1)
  27.                                 num2 = num2 +  Chr(13) + Chr(10) + "計算時間:" + Str(Timer - t) + "秒"
  28.                                 MsgBox (num2)
  29. 90:
  30.                             Next i
  31. 80:
  32.                         Next h
  33. 70:
  34.                     Next g
  35. 60:
  36.                 Next f
  37. 40:
  38.             Next d
  39. 30:
  40.         Next c
  41. 20:
  42.     Next b
  43. 10:
  44. Next a
  45. End Sub

代碼3

 

彭希仁 提供)

  1. Dim x, s As String
  2. Sub cai()
  3.     Call caii("", 0)
  4.     MsgBox s
  5. End Sub
  6. Sub caii(a, i)
  7.     For j = 1 To 9
  8.         If Not (a Like "*" & j & "*"And (a & j) Mod (i + 1) = 0 Then
  9.             If i + 1 = 9 Then
  10.                 s = s & a & j & vbCrLf
  11.             Else
  12.                 Call caii(a & j, i + 1)
  13.             End If
  14.         End If
  15.     Next j
  16. End Sub

代碼4:

  1. Sub cnft()
  2. getNum
  3. End Sub
  4. Sub getNum(Optional ByRef strNums As String = ""Optional ByRef iTurn As Integer = 1)
  5.     Dim i As Integer, tm As Single
  6.     tm = Timer
  7.     For i = 1 To 9
  8.         If InStr(strNums, i) = 0 Then
  9.             If (strNums & i) Mod iTurn = 0 Then
  10.                 If iTurn = 9 Then
  11.                     MsgBox strNums & i & vbCrLf & "用時:" & Timer - tm & "秒"
  12.                 Else
  13.                     Call getNum(strNums & i, iTurn + 1)
  14.                 End If
  15.             End If
  16.         End If
  17.     Next i
  18. End Sub

代碼5

 

  1. Sub macro1()
  2. Dim d, s, x, i As Long, j As Long, n As Currency, k As Long, befit As Boolean
  3. d = Array(1, 3, 7, 9)
  4. s = Array(2, 4, 6, 8)
  5. x = Split("0123 0132 0213 0231 0312 0321 1023 1032 1203 1230 1302 1320 2013 2031 2103 2130 2301 2310 3012 3021 3102 3120 3201 3210")
  6. For i = 0 To 23
  7. For j = 0 To 23
  8. n = Val(d(Mid(x(i), 1, 1)) & s(Mid(x(j), 1, 1)) & d(Mid(x(i), 2, 1)) & s(Mid(x(j), 2, 1)) & 5 & s(Mid(x(j), 3, 1)) & d(Mid(x(i), 3, 1)) & s(Mid(x(j), 4, 1)) & d(Mid(x(i), 4, 1)))
  9. befit = True
  10. For k = 2 To 8
  11. If Not Left(n, k) Mod k = 0 Then befit = FalseExit For
  12. Next
  13. If befit = True Then Debug.Print n
  14. Next
  15. Next
  16. End Sub

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章