一个九位数由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

 

你可能感兴趣的:(C++,c,F#,C#,J#)