数学中国

 找回密码
 注册
搜索
热搜: 活动 交友 discuz
查看: 19001|回复: 10

9 个数码填空题

[复制链接]
发表于 2017-3-7 16:49 | 显示全部楼层 |阅读模式
收到微信群中的一道数码填空趣题,转贴在这里:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2017-3-7 22:51 | 显示全部楼层
本帖最后由 luyuanhong 于 2017-3-7 22:54 编辑

空格中填入 1~9 ,数字不可重复。

       1 7
    ×   4
    --------
       6 8
    + 2 5
    ---------
       9 3
 楼主| 发表于 2017-3-8 01:11 | 显示全部楼层
谢谢陆老师的解答! 我写了个程序,运行结果说明这是唯一解。
发表于 2017-3-8 07:02 | 显示全部楼层
楼上 elimqiu 的帖子很好!我已将此帖转贴到“陆老师的《数学中国》园地”。
 楼主| 发表于 2017-3-9 03:10 | 显示全部楼层
以下是这个填空问题的解的搜索程序:
  1. # List a - b
  2. def setMinus(a,b):
  3.         c = []
  4.         for j in a:
  5.                 if b.count(j) == 0:
  6.                         c.append(j)
  7.         return c

  8. #  123 -> [1,2,3]
  9. def numToSet(n):
  10.         r = n % 10
  11.         s = [r]
  12.         n = (n -r)/10
  13.         while n > 0:
  14.                 r = n % 10
  15.                 n = (n-r)/10
  16.                 if s.count(r) == 0:
  17.                         s.insert(0,r)
  18.         return s

  19. # List  a inteset b
  20. def setCap(a,b):
  21.         s = []
  22.         if len(a) <= len(b):
  23.                 u,v = a,b
  24.         else:
  25.                 u,v = b,a
  26.         for j in u:
  27.                 if v.count(j) > 0:
  28.                         if s.count(j) == 0:
  29.                                 s.append(j)
  30.         return s

  31. # List  a union b
  32. def setCup(a,b):
  33.         s = list(a)
  34.         for j in b:
  35.                 if s.count(j) == 0:
  36.                         s.append(j)
  37.         return s

  38. def tryNine():
  39.         w = [1,2,3,4,5,6,7,8,9]
  40.         sol = []
  41.         for m in w:
  42.                 if m > 8:
  43.                         break
  44.                 u = setMinus(w,[m])
  45.                 for a in u:
  46.                         v = setMinus(u,[a])
  47.                         if m*(10*a + v[0]) > 98:
  48.                                 break
  49.                         for b in v:
  50.                                 n = 10*a+b
  51.                                 t = n*m
  52.                                 if t > 98:
  53.                                         # print "m,a,b =",[m,a,b]
  54.                                         break
  55.                                 mSet = setCup([m,a,b,],numToSet(t))
  56.                                 if len(mSet) < 5:
  57.                                         continue
  58.                                 nSet = setMinus(w,mSet)
  59.                                 for i in nSet:
  60.                                         k = setMinus(nSet,[i])
  61.                                         for j in k:
  62.                                                 sm = t + 10*i + j
  63.                                                 if sm > 98:
  64.                                                         # print "m,a,b,i,j = ",[m,a,b,i,j]
  65.                                                         break
  66.                                                 tmp = numToSet(sm)
  67.                                                 tp = setMinus(nSet,setCup([i,j],tmp))
  68.                                                 if len(tp) == 0:
  69.                                                         sol.append(setCup(setCup(mSet,[i,j]),tmp))
  70.         c = len(sol)
  71.         if c == 0:
  72.                 print "No solution found."
  73.         elif c > 1:
  74.                 print "Multiple solutions found:"
  75.                 for sl in sol:
  76.                         print sl
  77.         else:
  78.                 sl = sol[0]
  79.                 print "Solution is unique:"
  80.                 print "%5d" % (10*sl[1]+sl[2])
  81.                 print "x%4d" % sl[0]
  82.                 print "------"
  83.                 print "%5d" % (10*sl[3]+sl[4])
  84.                 print "+%4d" % (10*sl[5]+sl[6])
  85.                 print "------"
  86.                 print "%5d" % (10*sl[7]+sl[8])
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2017-3-9 11:40 | 显示全部楼层
luyuanhong 发表于 2017-3-7 14:51
空格中填入 1~9 ,数字不可重复。

       1 7

请教陆老师,这个题目如果不用计算机编程来解,而是纯粹手工计算,那么解答这道题的思路过程是什么样的呢?感觉无从下手啊。
发表于 2017-3-9 18:24 | 显示全部楼层
门外汉 发表于 2017-3-9 11:40
请教陆老师,这个题目如果不用计算机编程来解,而是纯粹手工计算,那么解答这道题的思路过程是什么样的呢 ...

第2行的1位数是关键。
发表于 2017-3-9 19:45 | 显示全部楼层
王守恩 发表于 2017-3-9 10:24
第2行的1位数是关键。

能讲讲解题的思路过程吗?我对这道题很好奇,想知道解这种题目有什么技巧?
发表于 2017-3-10 08:21 | 显示全部楼层
门外汉 发表于 2017-3-9 19:45
能讲讲解题的思路过程吗?我对这道题很好奇,想知道解这种题目有什么技巧?

第2行的1位数是关键,有9种可能,逐一排除。
如果用1——9九张卡片,亲手去摆。
不用几分钟,答案就是唯一的。
发表于 2017-3-10 10:03 | 显示全部楼层
王守恩 发表于 2017-3-10 00:21
第2行的1位数是关键,有9种可能,逐一排除。
如果用1——9九张卡片,亲手去摆。
不用几分钟,答案就是 ...

哦,不知道陆老师解这题时思路与您相同吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-5-16 20:17 , Processed in 0.147880 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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