题目:
请将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
附几种解法:
由提供
- Subcnft()
-
- Dima
-
- DimstrNumsAsString
- strNums="1,2,3,4,5,6,7,8,9"
-
- Dimi,j,kAsInteger
- Fori=2To9
- a=Split(strNums,",")
- strNums=""
- Fork=0ToUBound(a)
- Forj=1To9
- If(a(k)&j)Modi=0Then
- IfInStr(a(k),j)=0Then
- strNums=strNums&","&a(k)&j
- EndIf
- EndIf
- Nextj
- Nextk
- strNums=Right(strNums,Len(strNums)-1)
- Nexti
- Erasea
- MsgBox("运行结果为:"&strNums)
- EndSub
代码2:
(IP 提供)
- SubGetit()
- Dima,b,c,d,e,f,g,h,iAsInteger,num1,num2AsString,xAsDouble
- e=5:num1="123456789":num2="此数为:":t=Timer
- Fora=1To9Step2
- Ifa=eThenGoTo10
- Forb=2To8Step2
- Forc=1To9Step2
- x=a+b+c
- Ifc=aOrc=eOrInt(x/3)<>x/3ThenGoTo30
- Ford=2To8Step2
- x=10*c+d
- Ifd=bOrInt(x/4)<>x/4ThenGoTo40
- Forf=2To8Step2
- x=d+e+f
- Iff=bOrf=dOrInt(x/3)<>x/3ThenGoTo60
- Forg=1To9Step2
- x=a*1000000+b*100000+c*10000+d*1000+e*100+f*10+g
- Ifg=aOrg=cOrg=eOrInt(x/7)<>x/7ThenGoTo70
- Forh=2To8Step2
- x=10*g+h
- Ifh=bOrh=dOrh=fOrInt(x/8)<>x/8ThenGoTo80
- Fori=1To9Step2
- Ifi=aOri=cOri=eOri=gThenGoTo90
- num2=num2+Mid(num1,a,1)+Mid(num1,b,1)+Mid(num1,c,1)
- num2=num2+Mid(num1,d,1)+Mid(num1,e,1)+Mid(num1,f,1)
- num2=num2+Mid(num1,g,1)+Mid(num1,h,1)+Mid(num1,i,1)
- num2=num2+Chr(13)+Chr(10)+"计算时间:"+Str(Timer-t)+"秒"
- MsgBox(num2)
- 90:
- Nexti
- 80:
- Nexth
- 70:
- Nextg
- 60:
- Nextf
- 40:
- Nextd
- 30:
- Nextc
- 20:
- Nextb
- 10:
- Nexta
- EndSub
代码3
( 提供)<!-- 性别在线状态 -->
- Dimx,sAsString
- Subcai()
- Callcaii("",0)
- MsgBoxs
- EndSub
- Subcaii(a,i)
- Forj=1To9
- IfNot(aLike"*"&j&"*")And(a&j)Mod(i+1)=0Then
- Ifi+1=9Then
- s=s&a&j&vbCrLf
- Else
- Callcaii(a&j,i+1)
- EndIf
- EndIf
- Nextj
- EndSub
代码4:
- Subcnft()
- getNum
- EndSub
- SubgetNum(OptionalByRefstrNumsAsString="",OptionalByRefiTurnAsInteger=1)
- DimiAsInteger,tmAsSingle
- tm=Timer
- Fori=1To9
- IfInStr(strNums,i)=0Then
- If(strNums&i)ModiTurn=0Then
- IfiTurn=9Then
- MsgBoxstrNums&i&vbCrLf&"用时:"&Timer-tm&"秒"
- Else
- CallgetNum(strNums&i,iTurn+1)
- EndIf
- EndIf
- EndIf
- Nexti
- EndSub
代码5
- Submacro1()
- Dimd,s,x,iAsLong,jAsLong,nAsCurrency,kAsLong,befitAsBoolean
- d=Array(1,3,7,9)
- s=Array(2,4,6,8)
- x=Split("012301320213023103120321102310321203123013021320201320312103213023012310301230213102312032013210")
- Fori=0To23
- Forj=0To23
- 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)))
- befit=True
- Fork=2To8
- IfNotLeft(n,k)Modk=0Thenbefit=False:ExitFor
- Next
- Ifbefit=TrueThenDebug.Printn
- Next
- Next
- EndSub