鱼C论坛

 找回密码
 立即注册
查看: 971|回复: 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
a,b,c,d,e = '6087','5173','1358','3825','2531'

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

#把满足有两位数字正确(不管位置)的组合放入列表
listkey=[]
for i in list9999:
    counta,countb,countc,countd,counte = 0,0,0,0,0
    for each_i in i:
        if each_i in a:
            counta += 1
        if each_i in b:
            countb += 1
        if each_i in c:
            countc += 1
        if each_i in d:
            countd += 1
        if each_i in e:
            counte += 1
        if counta==countb==countc==countd==counte==2:
            listkey.append(i)

for each_one in listkey[:]:
    temp = str(each_one)
    #逐一位比较,如果有相同则从列表剔除,剔除时有可能出现重复剔除,用了try
    for n in range(0,4):
        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]:
            try:
                listkey.remove(each_one)
            finally:
                break
print(listkey)

答案是['8712'],,小白一个,方法很笨
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

位置不对的意思是这两位密码不在它原本的位置,两位密码不一定是连在一起的,可能第一位跑到第四位去,第二位跑到第一位去
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-13 13:17:06 | 显示全部楼层
你的意思是不是从这两个数字整体来看位置不对,而不是单个数字的位置不对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-13 13:20:59 | 显示全部楼层
这是数字部分,位置部分我在想想
from itertools import combinations
from collections import defaultdict
a,b,c,d,e='6087','5173','1358','3825','5321'
suppose_number=''
correct_number=''
for i in combinations(a,2):
    for j in combinations(b,2):
        suppose_number+=''.join(i)+''.join(j)
        if len(set(suppose_number)&set(c))==2 and len(set(suppose_number)&set(d))==2 and len(set(suppose_number)&set(e))==2:
            if len(set(suppose_number)&set(a))==2 and len(set(suppose_number)&set(b))==2:
                correct_number=suppose_number
        suppose_number=''
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-13 13:25:08 | 显示全部楼层
       无法锁死答案,比如:0356、1278 都能符合条件。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

0356不满足第一次手机密码‘每次密码中均有2位数字正确’, 1278在第3次输入的时候不满足‘每个密码位置都不对’
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

8712我算的
0356和1278都有重复位置
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

#把满足有两位数字正确(不管位置)的组合放入列表
listkey=[]
for i in list9999:
    counta,countb,countc,countd,counte = 0,0,0,0,0
    for each_i in i:
        if each_i in a:
            counta += 1
        if each_i in b:
            countb += 1
        if each_i in c:
            countc += 1
        if each_i in d:
            countd += 1
        if each_i in e:
            counte += 1
        if counta==countb==countc==countd==counte==2:
            listkey.append(i)

for each_one in listkey[:]:
    temp = str(each_one)
    #逐一位比较,如果有相同则从列表剔除,剔除时有可能出现重复剔除,用了try
    for n in range(0,4):
        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]:
            try:
                listkey.remove(each_one)
            finally:
                break
print(listkey)

答案是['8712'],,小白一个,方法很笨
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

6啊...思路正确,反正我想不出来.答案就是8712
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 20:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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