鱼C论坛

 找回密码
 立即注册
查看: 1445|回复: 9

[已解决]关于用Python解决数学问题

[复制链接]
发表于 2020-3-13 11:37:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

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

x
本帖最后由 既晏 于 2020-3-13 11:38 编辑

有这样一个问题:
        小明五次输入四位数的手机密码均错误,但是每次输入的密码中有两位数字正确,位置都不对。现求小明正确的四位数手机密码。
        五次手机密码分别是: 6087, 5173, 1358, 3825, 2531.

有没有大佬用Python代码把这题解出来!!
最佳答案
2020-3-13 15:39:14
  1. a,b,c,d,e = '6087','5173','1358','3825','2531'

  2. #创建一个'0000'到'9999'的列表
  3. list9999= []
  4. for q1 in range(0,10):
  5.     for q2 in range(0,10):
  6.         for q3 in range(0,10):
  7.             for q4 in range(0,10):
  8.                 temp = str(q1)+str(q2)+str(q3)+str(q4)
  9.                 list9999.append(temp)

  10. #把满足有两位数字正确(不管位置)的组合放入列表
  11. listkey=[]
  12. for i in list9999:
  13.     counta,countb,countc,countd,counte = 0,0,0,0,0
  14.     for each_i in i:
  15.         if each_i in a:
  16.             counta += 1
  17.         if each_i in b:
  18.             countb += 1
  19.         if each_i in c:
  20.             countc += 1
  21.         if each_i in d:
  22.             countd += 1
  23.         if each_i in e:
  24.             counte += 1
  25.         if counta==countb==countc==countd==counte==2:
  26.             listkey.append(i)

  27. for each_one in listkey[:]:
  28.     temp = str(each_one)
  29.     #逐一位比较,如果有相同则从列表剔除,剔除时有可能出现重复剔除,用了try
  30.     for n in range(0,4):
  31.         if temp[n] == a[n] or temp[n] == b[n] or temp[n] == c[n] or temp[n] == d[n] or temp[n] == e[n]:
  32.             try:
  33.                 listkey.remove(each_one)
  34.             finally:
  35.                 break
  36. print(listkey)
复制代码


答案是['8712'],,小白一个,方法很笨
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-13 12:31:40 | 显示全部楼层
你确定你给的答案正确吗?,我算出来是6053这个四个数字,但是你说位置都不对,那3往哪放,你后面四次输入3分别在1,2,3,4号位
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-13 13:10:38 | 显示全部楼层
fan1993423 发表于 2020-3-13 12:31
你确定你给的答案正确吗?,我算出来是6053这个四个数字,但是你说位置都不对,那3往哪放,你后面四次输入3 ...

位置不对的意思是这两位密码不在它原本的位置,两位密码不一定是连在一起的,可能第一位跑到第四位去,第二位跑到第一位去
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-13 13:17:06 | 显示全部楼层
你的意思是不是从这两个数字整体来看位置不对,而不是单个数字的位置不对
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-13 13:20:59 | 显示全部楼层
这是数字部分,位置部分我在想想
  1. from itertools import combinations
  2. from collections import defaultdict
  3. a,b,c,d,e='6087','5173','1358','3825','5321'
  4. suppose_number=''
  5. correct_number=''
  6. for i in combinations(a,2):
  7.     for j in combinations(b,2):
  8.         suppose_number+=''.join(i)+''.join(j)
  9.         if len(set(suppose_number)&set(c))==2 and len(set(suppose_number)&set(d))==2 and len(set(suppose_number)&set(e))==2:
  10.             if len(set(suppose_number)&set(a))==2 and len(set(suppose_number)&set(b))==2:
  11.                 correct_number=suppose_number
  12.         suppose_number=''
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-13 13:25:08 | 显示全部楼层
       无法锁死答案,比如:0356、1278 都能符合条件。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-13 13:32:50 | 显示全部楼层
jackz007 发表于 2020-3-13 13:25
无法锁死答案,比如:0356、1278 都能符合条件。

0356不满足第一次手机密码‘每次密码中均有2位数字正确’, 1278在第3次输入的时候不满足‘每个密码位置都不对’
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-13 13:35:45 | 显示全部楼层
jackz007 发表于 2020-3-13 13:25
无法锁死答案,比如:0356、1278 都能符合条件。

8712我算的
0356和1278都有重复位置
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-13 15:39:14 | 显示全部楼层    本楼为最佳答案   
  1. a,b,c,d,e = '6087','5173','1358','3825','2531'

  2. #创建一个'0000'到'9999'的列表
  3. list9999= []
  4. for q1 in range(0,10):
  5.     for q2 in range(0,10):
  6.         for q3 in range(0,10):
  7.             for q4 in range(0,10):
  8.                 temp = str(q1)+str(q2)+str(q3)+str(q4)
  9.                 list9999.append(temp)

  10. #把满足有两位数字正确(不管位置)的组合放入列表
  11. listkey=[]
  12. for i in list9999:
  13.     counta,countb,countc,countd,counte = 0,0,0,0,0
  14.     for each_i in i:
  15.         if each_i in a:
  16.             counta += 1
  17.         if each_i in b:
  18.             countb += 1
  19.         if each_i in c:
  20.             countc += 1
  21.         if each_i in d:
  22.             countd += 1
  23.         if each_i in e:
  24.             counte += 1
  25.         if counta==countb==countc==countd==counte==2:
  26.             listkey.append(i)

  27. for each_one in listkey[:]:
  28.     temp = str(each_one)
  29.     #逐一位比较,如果有相同则从列表剔除,剔除时有可能出现重复剔除,用了try
  30.     for n in range(0,4):
  31.         if temp[n] == a[n] or temp[n] == b[n] or temp[n] == c[n] or temp[n] == d[n] or temp[n] == e[n]:
  32.             try:
  33.                 listkey.remove(each_one)
  34.             finally:
  35.                 break
  36. print(listkey)
复制代码


答案是['8712'],,小白一个,方法很笨
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-13 15:50:41 | 显示全部楼层
supersuNB 发表于 2020-3-13 15:39
答案是['8712'],,小白一个,方法很笨

6啊...思路正确,反正我想不出来.答案就是8712
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-14 22:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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