数学中国

 找回密码
 注册
搜索
热搜: 活动 交友 discuz
楼主: ccmmjj

将五个数字连成一环,使得这些数以及相邻的二、三、四、五个数之和,分别等于 1~21

[复制链接]
发表于 2019-2-8 12:36 | 显示全部楼层
本帖最后由 天山草@ 于 2019-2-8 20:05 编辑

具体程序如下:

Private Sub form_Click()
     Open "六颗珠子 1.txt" For Output As #1      ' 将计算结果记入一个 txt 文件
     
     Dim a(31)   '{A}={A1}+{A2}+{A3}+{A4}+{A5}+{A6}={1,2,3,4,5,…,30,31} 集合的元素个数
     n = 31
     For x = 2 To 25      ' 此处 25 估计得肯定偏大了(防止漏掉解),但不会影响计算结果。
      For y = 2 To 25
       For z = 2 To 25
        For u = 2 To 25
        v = 30 - x - y - z - u
        a(1) = 1: a(2) = x: a(3) = y: a(4) = z: a(5) = u: a(6) = v
        a(7) = 1 + x: a(8) = x + y: a(9) = y + z: a(10) = z + u: a(11) = u + v: a(12) = v + 1
        a(13) = 1 + x + y: a(14) = x + y + z: a(15) = y + z + u: a(16) = z + u + v: a(17) = u + v + 1: a(18) = v + 1 + x
        a(19) = 1 + x + y + z: a(20) = x + y + z + u: a(21) = y + z + u + v: a(22) = z + u + v + 1: a(23) = u + v + 1 + x: a(24) = v + 1 + x + y
        a(25) = 31 - 1: a(26) = 31 - x: a(27) = 31 - y: a(28) = 31 - z: a(29) = 31 - u: a(30) = 31 - v
        a(31) = 31
     For i = 1 To n - 1   '从小到大排序
          Min = i
        For j = i + 1 To n
         If a(j) < a(Min) Then Min = j
        Next j
        t = a(i)
       a(i) = a(Min)
       a(Min) = t
     Next i               '排序结束
     
     For i = 1 To n - 1  '从小到大的排序结果中去掉有相同数字的
       If a(i) <= 0 Then GoTo 111         ' 去掉零和负数
       If a(i) = a(i + 1) Then GoTo 111  ' 去掉相同数字
     Next i
       If a(31) = a(1) Then GoTo 111     ' 最后一个与最前一个比较是否相同

  '  对于符合要求的集合,输出计算结果:
     
     Print "k="; Trim(Str(1)); ",x="; Trim(Str(x)); ",y="; Trim(Str(y)); ",z="; Trim(Str(z)); ",u="; Trim(Str(u)); ",v="; Trim(Str(v))
     Print #1, "k="; Trim(Str(1)); ",x="; Trim(Str(x)); ",y="; Trim(Str(y)); ",z="; Trim(Str(z)); ",u="; Trim(Str(u)); ",v="; Trim(Str(v))
     
111: Next u
     Next z
     Next y
     Next x
   
      Close
      End Sub
发表于 2019-2-8 12:37 | 显示全部楼层
本帖最后由 天山草@ 于 2019-2-8 20:07 编辑

程序运行结果:
k=1,x=2,y=5,z=4,u=6,v=13
k=1,x=2,y=7,z=4,u=12,v=5
k=1,x=3,y=2,z=7,u=8,v=10
k=1,x=3,y=6,z=2,u=5,v=14
k=1,x=5,y=12,z=4,u=7,v=2
k=1,x=7,y=3,z=2,u=4,v=14
k=1,x=10,y=8,z=7,u=2,v=3
k=1,x=13,y=6,z=4,u=5,v=2
k=1,x=14,y=4,z=2,u=3,v=7
k=1,x=14,y=5,z=2,u=6,v=3

【说明】程序给出了 10 个解答,但是其中 5 个是从手串背面观察的,手串翻转过来将与另 5 个解答相同。
因此真正的解答只有 5 组。这 5 组的答案与 fungarwai 的完全一样。
发表于 2019-2-8 12:48 | 显示全部楼层
上述程序运行时间小于 9 秒钟。

点评

天山兄能用程序解问题,在下佩服。只是 fungarwai 亦是用程序解决,所以答案相同并不奇怪。不过两位的程序似不同,用的软件亦不同。然而一般情况下解的存在性,似不能用计算机程序解决。n>=5必有解,此猜测可证否   发表于 2019-2-8 14:26
贪心的问:给个7个数的,手工算不了,编程还是不行。  发表于 2019-2-8 14:20
发表于 2019-2-8 13:07 | 显示全部楼层
这种手串数字表示法最多为n*(n-1)+1个,少于此值有解,多于此值无解。

点评

为什么:少于此值有解,多于此值无解?  发表于 2019-2-8 13:29
发表于 2019-2-8 14:06 | 显示全部楼层
因为手串最多能构成n*(n-1)+1个独立线性方程,在这些方程中未知数只有n个,而方程却多于未知数个数(即便刨去n个未知数),仍然有n^2-2n+1个方程在控制未知数的取值。多于此值时,无法构造出多于此值的方程,所以肯定无解。而少于此值时控制方程个数随不会减少,但取值有了灵活度。

点评

谢谢!慢慢琢磨。  发表于 2019-2-8 14:15
发表于 2019-2-8 15:31 | 显示全部楼层
由于方程数为n*(n-1)+1,把两个未知数数的加在一起为2*(n*(n-1)+1);3个的加在一起为3*(n*(n-1)+1),n-1个未知数的加在一起为(n-1)*(n*(n-1)+1),得到的结果都是x1+x2+x3+......+Xn=n*(n-1)+1,这么多方程合并的结果是一个不定方程,所以它有好多解,之所以它的解是有限的,一个是正整数问题,另一个是单个方程又控制其他解,它们都是相互的,只要知道任何一组k个未知数的和值,我们有总值就可以求出每个位置数,关键问题,我们不知道任何一组的值,但是每个解中必须有1,2,因为它们不能有其它的两个整数合成,如果按连续(前边的n-1个值)则最后一个值可以取到最大值n*(n-1)+1-n(n-1)/2=n(n-1)/2+1,这个值也是不能取到的,因为前边的n-1值一定不连续,在就是第二第三大值肯定是有n-1个未知数的和值(这与必有1,2是对称的),除此之外我们在没有其它信息了,总结,有1,2,最大取值小于总表示个数的一半,知道任何一组相同未知数的和就可以确定每个未知数的值。因为未知数方程虽然多于未知数个数很多,但经过加减法合并方程后,实际方程个数与未知数个数相同,所以每种赋值可以确定一种解,最后方程组为nx1+(n-1)x2+(n-2)x3+......+xn=N1

把系数向后一个一个的替换,直到最后一个未知数的系数是n为止,这就是n个方程,它们有唯一解(线性不定方程,未知数个数与方程组中的方程个数一致时)。
发表于 2019-2-8 16:26 | 显示全部楼层
因为n个数不同,且一定有1,2,所以可以减去2(n-1)+1留下n-2个未知数,由于不同可以求x1+2x2+3x3+.......+(n-2)x(n-2)=n(n-1)+1-2(n-1)-1=n^2-3n+2的正整数解,这里前边的数字是系数,后边的数字是角码它们的解不是太多,然后从此解中再给方程赋值,但是角码值与实际值的大小无关(在此方程中,x(n-2)是最小值,在有x(n-2)+x(n-3)得到第二小值,一次类推,把未知数的值加在一起得到最大值(要同一加2)。然后排除,这里边仍然很难,因为它们不是按大小排序的,而是最优化问题。
发表于 2019-2-8 21:19 | 显示全部楼层
fungarwai 发表于 2019-2-7 20:05
有這5個解
1 2 5 4 6 13
1 2 7 4 12 5

5 个解,每个解去掉最大一个数,并在此处断开(断开了就不能接回去),
1 2 5 4 6 13 变成 1 2 5 4 6
1 2 7 4 12 5 变成 4 7 2 1 5
1 3 2 7 8 10 变成 1 3 2 7 8
1 3 6 2 5 14 变成 1 3 6 2 5
1 7 3 2 4 14 变成 1 7 3 2 4
这 5 串数(规定第 1 个数要大于第 5 个数),好像有点规律。
求助高人:再来几串7个数的解,一并解决问题。
发表于 2019-2-8 22:44 | 显示全部楼层
七颗珠子的,算了半天,也没出结果。检查程序好像没有明显毛病? 又好像运行不正常,有死循环?
明天再说吧。
发表于 2019-2-8 23:02 | 显示全部楼层
本帖最后由 天山草@ 于 2019-2-8 23:41 编辑

至于说为什么 n = 7 颗珠子时,各数字总和是 (n-1)n +1 = 6*7+1=43 呢?
因为 {A1} 中元素有 7 个,{A2} 是相邻数字相加,相加结果也有 7 个,{A3} 是相邻三个数的相加,也是 7 个结果。同样 {A4}、{A5}、{A6} 也各有 7 个结果。以上共有 6*7 =42 个,还有一个是 {A7},它是所有珠子上数字的和,只有一个结果。因此,共计有  6*7+1=43 个数字。

已知对于 n = 3,4,5,6 都有解。 至于 n ≥ 7 是否都有解呢? 是个疑问。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|数学中国 ( 京ICP备05040119号 )

GMT+8, 2024-3-29 21:33 , Processed in 0.068360 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表