cjc 发表于 2013-2-4 23:12:15

一个九位数由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]
查看完整版本: 一个九位数由1-9数字组成并前N 位被N整除