• 一个九位数由19数字组成并前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

     

  • 相关阅读:
    Unity3D在各平台上的路径
    Unity简单的单例模式
    C#遍历枚举(Enum)
    C#常用的流类型(FileStream,SteamWriter/StreamReader,MemoryStream等)
    编写一个C程序,运行时输入a,b,c三个值,输出其中最大者
    精确一维搜索算法(直接法)
    Java一维数组求和
    java 导出EXCEL
    Java判断字符串的数字类型(小数、整数)
    网址存储
  • 原文地址:https://www.cnblogs.com/fengju/p/6336247.html
Copyright © 2020-2023  润新知