一个九位数由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. Subcnft()
  2. '定义一个数组
  3. Dima
  4. '定义字符串
  5. DimstrNumsAsString
  6. strNums="1,2,3,4,5,6,7,8,9"
  7. '开始循环
  8. Dimi,j,kAsInteger
  9. Fori=2To9
  10. a=Split(strNums,",")
  11. strNums=""
  12. Fork=0ToUBound(a)
  13. Forj=1To9
  14. If(a(k)&j)Modi=0Then
  15. IfInStr(a(k),j)=0Then
  16. strNums=strNums&","&a(k)&j
  17. EndIf
  18. EndIf
  19. Nextj
  20. Nextk
  21. strNums=Right(strNums,Len(strNums)-1)
  22. Nexti
  23. Erasea
  24. MsgBox("运行结果为:"&strNums)
  25. EndSub

代码2:

IP zhang5382 提供)

  1. SubGetit()
  2. Dima,b,c,d,e,f,g,h,iAsInteger,num1,num2AsString,xAsDouble
  3. e=5:num1="123456789":num2="此数为:":t=Timer
  4. Fora=1To9Step2
  5. Ifa=eThenGoTo10
  6. Forb=2To8Step2
  7. Forc=1To9Step2
  8. x=a+b+c
  9. Ifc=aOrc=eOrInt(x/3)<>x/3ThenGoTo30
  10. Ford=2To8Step2
  11. x=10*c+d
  12. Ifd=bOrInt(x/4)<>x/4ThenGoTo40
  13. Forf=2To8Step2
  14. x=d+e+f
  15. Iff=bOrf=dOrInt(x/3)<>x/3ThenGoTo60
  16. Forg=1To9Step2
  17. x=a*1000000+b*100000+c*10000+d*1000+e*100+f*10+g
  18. Ifg=aOrg=cOrg=eOrInt(x/7)<>x/7ThenGoTo70
  19. Forh=2To8Step2
  20. x=10*g+h
  21. Ifh=bOrh=dOrh=fOrInt(x/8)<>x/8ThenGoTo80
  22. Fori=1To9Step2
  23. Ifi=aOri=cOri=eOri=gThenGoTo90
  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. Nexti
  31. 80:
  32. Nexth
  33. 70:
  34. Nextg
  35. 60:
  36. Nextf
  37. 40:
  38. Nextd
  39. 30:
  40. Nextc
  41. 20:
  42. Nextb
  43. 10:
  44. Nexta
  45. EndSub

代码3

彭希仁 提供)

  1. Dimx,sAsString
  2. Subcai()
  3. Callcaii("",0)
  4. MsgBoxs
  5. EndSub
  6. Subcaii(a,i)
  7. Forj=1To9
  8. IfNot(aLike"*"&j&"*")And(a&j)Mod(i+1)=0Then
  9. Ifi+1=9Then
  10. s=s&a&j&vbCrLf
  11. Else
  12. Callcaii(a&j,i+1)
  13. EndIf
  14. EndIf
  15. Nextj
  16. EndSub

代码4:

  1. Subcnft()
  2. getNum
  3. EndSub
  4. SubgetNum(OptionalByRefstrNumsAsString="",OptionalByRefiTurnAsInteger=1)
  5. DimiAsInteger,tmAsSingle
  6. tm=Timer
  7. Fori=1To9
  8. IfInStr(strNums,i)=0Then
  9. If(strNums&i)ModiTurn=0Then
  10. IfiTurn=9Then
  11. MsgBoxstrNums&i&vbCrLf&"用时:"&Timer-tm&"秒"
  12. Else
  13. CallgetNum(strNums&i,iTurn+1)
  14. EndIf
  15. EndIf
  16. EndIf
  17. Nexti
  18. EndSub

代码5

  1. Submacro1()
  2. Dimd,s,x,iAsLong,jAsLong,nAsCurrency,kAsLong,befitAsBoolean
  3. d=Array(1,3,7,9)
  4. s=Array(2,4,6,8)
  5. x=Split("012301320213023103120321102310321203123013021320201320312103213023012310301230213102312032013210")
  6. Fori=0To23
  7. Forj=0To23
  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. Fork=2To8
  11. IfNotLeft(n,k)Modk=0Thenbefit=False:ExitFor
  12. Next
  13. Ifbefit=TrueThenDebug.Printn
  14. Next
  15. Next
  16. EndSub

你可能感兴趣的:(一个九位数由1-9数字组成并前N 位被N整除)