`
cjc
  • 浏览: 683530 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一个九位数由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. 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 =  False Exit   For
  12. Next
  13. If  befit =  True   Then  Debug.Print n
  14. Next
  15. Next
  16. End   Sub

2
0
分享到:
评论

相关推荐

    给定一个只包含数字[0…9]的字符串,请使用字符中的某些字符,构建一个能够整除15的最大整数,注意字符中的每个字符只能使用一次

    如果不存在0,那么我们需要检测数组中的每个数字的余数,对于余数为1和2的数字,我们可以删除最小的一个,直到数组中所有数字的余数之和能被3整除。最后,我们输出构建的最大整数。 代码实现: 以下是使用C++语言...

    小学数学数学故事能被711和13整除的数

    对于任何整数n,如果n的末三位数字组成的数x和去掉末三位后的数y满足以下条件,那么n就能被这三个数整除: 1. 如果y - x能够被7整除,那么n能被7整除。 2. 如果x - y能够被11整除,那么n能被11整除。 3. 如果y - x...

    六年级数学上册 1.3 能被2,5整除的数同步测试题(无答案) 沪教版五四制 试题.doc

    7. 用0,5,8三个数字组成的三位数能同时被2,5整除,则最小的三位数是508。 8. 2的倍数:36, 90, 102, 10, 22, 290, 634 5的倍数:90, 75, 10, 290, 985, 630 9. 能力检测题解: - 使这个数能被2整除的三位数是...

    2019 CSP-S组 第1轮 初赛 答案+解析 好--13页.pdf

    答案是D,解析是n个点最多n(n+1)/2条边,要不连通,至少去掉n-1条边n(n+1)/2-(n-1)≥28,n最小为8。 试题9:一些数字可以颠倒过来看,例如0、1、8颠倒过来看还是本身,6颠倒过来是9,9颠倒过来看还是6,其他数字...

    PTA-条件与循环-求所有由1、2、3、4这4个数字组成的素数

    本题目的目标是通过循环结构来生成所有由1、2、3、4这四个数字组成且为素数的数,并按照从小到大的顺序输出。这里我们将详细解析如何实现这个程序。 首先,我们需要了解什么是素数。素数是指除了1和它自身外,不能...

    六年级奥数(数的整除).doc

    - 从1, 2, 3, 4, 5, 6中选择数字组成能被每个数字整除的最小数,通过排除法和整除特征,可以确定组成数字为122364。 通过掌握整除的性质和特征,不仅能解决简单的数学问题,还能应对复杂的应用题,培养学生的数学...

    c语言基础练习

    --实现函数,打印出所有用1,2,3,4四个数字组成的各位数都不重复的三位数(例如234) --实现函数,打印出2000以内所有能被7整除的数,并返回个数 --实现函数,将数组从小到大排序后输出 --实现函数,输出9*9的国际...

    2.3.4.5等数除的特征详解

    具体操作是:先将一个数的个位数字去掉,然后从剩下的数中减去个位数的两倍,如果得到的差能够被7整除,那么原数也能够被7整除。举个例子,对于数415,我们先去掉个位数5,得到41,然后减去5的两倍即10,得到31,...

    公务员考试-行测-数量关系解题技巧-数字特性秒杀.docx

    - 能被3、9整除的数,其所有位上的数字之和也必须能被3、9整除。 - 对于7、11、13的整除性,可以通过将数分为末三位数和剩余部分,并计算二者之差来判断。如果该差能被7、11、13整除,则原数也能被它们整除。 2. ...

    c代码-9.键盘输入一个三位数的正整数,其个位与百位相加若等于十位上的数字则输出"Yes",否则输出"No"。例如,输入"176",则输出"Yes"。输入"258",则输出"No"

    在这个C语言编程问题中,我们需要编写一段代码,它能接收用户通过键盘输入的一个三位数的正整数,然后检查这个数的个位数和百位数之和是否等于它的十位数。如果相等,程序将输出"Yes",否则输出"No"。下面我们将详细...

    六年级数学考前专项复习提高训练 数的整除精选.doc

    10. **满足特定条件的三位数**:一个三位数既能被2整除,又能被3整除,且个位、十位上相同,这个三位数最大是996,因为个位和十位相同且最大是9,同时要满足被2和3整除,所以百位是9。 11. **3和5的倍数特征**:0, ...

    10个经典程序c语言

    此段代码的目标是找出一个由多个9组成的数,使得该数能被用户输入的数整除。首先通过 `scanf` 获取用户输入的数 `zi`。然后使用 `while` 循环不断尝试增加9的数量,直到找到符合条件的数为止。循环内部首先判断当前...

    江苏省金湖县实验中学高中数学 奥赛辅导 数论初步—数的整除性

    问题5应用费马小定理证明一个由多个9组成的数能被13整除;问题6则涉及到理解数的位值和整除关系,以找到满足特定条件的数A;问题7则需要运用进位制的基本性质来处理不同进制间的转换问题。 通过解决这些问题,学生...

    冀教版五年级数学下册应用题精选.doc

    6. 要使六位数8264的左右各添一个数码后能被45整除,意味着这个新的数既是9的倍数又是5的倍数。9的倍数条件是所有位数字之和是9的倍数,5的倍数条件是末尾是0或5。结合这两个条件,我们可以找出符合条件的六位数。 ...

    六年级迎春杯PPT学习教案.pptx

    【例7】这题要求组成一个被667整除的6位数,需要分析667的因数,以及利用整除的性质来确定数字排列。 【例9】小马虎看错数字导致的乘积是1872,可以通过除以8(5和8相差3)找到原始乘积。 【例10】两个互质的合数...

    练习P20入门版答案

    一个三位数,各位数字互不相同,十位数字比个位、百位数字之和还要大,且十位、百位数字之和不是质数。编程找出所有符合条件的三位数。 注:1. 不能手算后直接打印结果。 2. “质数”即“素数”,是指除1和自身...

    26道基础算法题.pdf

    **问题描述**:猴子第一天摘桃并吃掉一半再多吃一个,之后每天都吃前一天剩下的一半再多吃一个,到第10天只剩下1个桃子。求第一天摘了多少个桃子。 **解题思路**: - 采用逆向思维,从第10天往回推算。 - 设第\(n\)...

    补充习题(1) (14).doc

    首先,我们来看第一个问题,即用2、3、4、0这四个数字组成没有重复数字的三位数。这个问题涉及到排列的概念,因为三位数的每一位数都不能重复。排列是指从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列...

    java基础练习题

    递归函数的关键在于确定递归结束条件(if(n==1||n==2)),并在非结束条件下,递归调用自身来累加结果(return fun(n-1)+fun(n-2))。 程序2要求判断指定范围内(101-200)有多少个素数,并输出这些素数。素数是指...

Global site tag (gtag.js) - Google Analytics