一个九位数由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 提供
<div class="highlighter">
[*]Sub cnft()<li class="alt">
[*] '定义一个数组
[*] Dim a
[*] '定义字符串
[*] Dim strNums As String
[*] strNums = "1,2,3,4,5,6,7,8,9"
[*] '开始循环
[*] Dim i, j, k As Integer
[*] For i = 2 To 9
[*] a = Split(strNums, ",")
[*] strNums = ""
[*] For k = 0 To UBound(a)
[*] For j = 1 To 9
[*] If (a(k) & j) Mod i = 0 Then
[*] If InStr(a(k), j) = 0 Then
[*] strNums = strNums & "," & a(k) & j
[*] End If
[*] End If
[*] Next j
[*] Next k
[*] strNums = Right(strNums, Len(strNums) - 1)
[*] Next i
[*] Erase a
[*]
[*] MsgBox ("运行结果为:" & strNums)
[*]End Sub<li class="alt">
页:
[1]