今天在园子里看到博客:超难面试题:甲乙两人互猜数字(数理逻辑)。然后琢磨了半天,写了个Python程序实现算法,我得出来的结果是1,6或1,8或35,42的组合,

不知道是否正确,请高人指点?

下面列出实现算法代码(代码按照题目文字一步步进行的,没有优化):

# -*- coding: utf-8  -*-
#!/usr/local/bin/python def is_prime2(number):
'''
判断数字是否是特殊质数(数学上质数和分解因子相同的数)。分解因子相同的数,如:4,9等。
'''
_is_primenum = True
for item in range(2,number,1):#不考虑1乘以number
if number % item == 0:
if (number/item) == item: #两个因子不能相同
continue
_is_primenum = False
break
return _is_primenum def combination(data, t, vl):
'''
计算一组数的组合
'''
_kk = len(data)
_ret_list = []
for _i in range(_kk-t+1):
vl.append(data[_i])
new_data = data[_i+1:]
if t-1 == 1:
for _j in range(len(new_data)):
_data_str = ','.join(map(str,vl))+','+str(new_data[_j])
_ret_list.append(_data_str)
else:
_ret_list.extend(combination(new_data, t-1, vl))
vl.pop()
return _ret_list def generate_combine(num_list, pick_num):
_v1 = [] # temp variable.
return combination(num_list, pick_num, _v1) def filter_1_a(_combination_list):
'''
甲:“我不知道这两个数是什么” 遍历所有组合,过滤掉能判断出结果的组合
'''
_result_dict = {} # 存储key为乘积的字典,value是组合的数组。
_new_combination_list = [] #存储还有效的组合 #由于甲不知道这两个数,可以肯定乘积不是质数,排除这类组合。
for item in _combination_list:
a, b = item.split(',',1)
_product = int(a) * int(b) #甲得到的数字
if not is_prime2(_product):
if _product in _result_dict:
_result_dict[_product] +=[item]
else:
_result_dict[_product] =[item] _new_result_dict = {} #便于理解,使用一个新变量存字典值
#由于甲不知道,表示value肯定要大于1种组合。
#比如[min=1,max=10], 乘积是15的组合:3*5一种,这样的组合应该排除掉。
for key,value in _result_dict.iteritems():
if len(value) > 1:
_new_result_dict[key] = value
_new_combination_list.extend(value) return _new_combination_list, _new_result_dict def filter_1_b(_combination_list):
'''
乙:“我也不知道” 遍历所有组合,过滤掉能判断出结果的组合
'''
_new_combination_list = [] #存储还有效的组合
_result_dict = {} # 存储key为两值相加的字典,value是组合的数组。 for item in _combination_list:
a, b = item.split(',',1)
_sum = int(a) + int(b) #乙得到的数字
if _sum in _result_dict:
_result_dict[_sum] +=[item]
else:
_result_dict[_sum] =[item] _new_result_dict = {}
#由于乙不知道,表示value肯定要大于1种组合。
for key,value in _result_dict.iteritems():
if len(value) > 1:
_new_result_dict[key] = value
_new_combination_list.extend(value)
return _new_combination_list, _new_result_dict def filter_2_a(_combination_list, product_dict, sum_dict):
'''
甲:“那我知道了” 遍历所有组合,过滤掉能判断出结果的组合
'''
_new_prodcut_dict = {}
#在乘积字典中,去除多余的组合
for key,value in product_dict.iteritems():
_new_value = []
for item in value:
if item in _combination_list:
_new_value.append(item)
if _new_value:
_new_prodcut_dict[key] = _new_value # 去除已经不在相加字典中的组合,
for key,value in _new_prodcut_dict.items():
_new_value = []
for item in value:
a, b = item.split(',',1)
_sum = int(a) + int(b) #乙得到的数字
if _sum in sum_dict:
_new_value.append(item)
_new_prodcut_dict[key] = _new_value # 由于甲知道,表示肯定等于1种组合。
_new_combination_list = [] #存储还有效的组合
_result_dict = {}
for key,value in _new_prodcut_dict.iteritems():
if len(value) == 1:
_result_dict[key] = value
_new_combination_list.extend(value)
return _new_combination_list, _result_dict def filter_2_b(_combination_list, sum_dict):
'''
乙:“那我也知道了” '''
_new_sum_dict = {}
#在相加字典中,去除多余的组合
for key,value in sum_dict.iteritems():
_new_value = []
for item in value:
if item in _combination_list:
_new_value.append(item)
if _new_value:
_new_sum_dict[key] = _new_value
return _new_sum_dict if __name__ == '__main__':
print "start..."
_min_num=1
_max_num=50 #产生数组
_num_list = range(_min_num,_max_num+1,1) #[1,2,3...,49,50] #生成Cn2的所有组合列表,如:['1,6', '2,3', '2,6', '3,4'...]
_combination_list = generate_combine(_num_list, 2) # 甲:“我不知道这两个数是什么”
_combination_list, _result_product_dict = filter_1_a(_combination_list) # 乙:“我也不知道”
_combination_list, _result_sum_dict = filter_1_b(_combination_list) # 甲:“那我知道了”
_new_combination_list, _result_product_dict = filter_2_a(_combination_list, _result_product_dict, _result_sum_dict)
print u"最终的组合:", _new_combination_list
print u"最终的乘积字典:", _result_product_dict # 乙:“那我也知道了”
_result_sum_dict = filter_2_b(_new_combination_list, _result_sum_dict)
print u"最终的相加字典:", _result_sum_dict print "end..."

用python实现了一下:甲乙两人互猜数字(数理逻辑)的更多相关文章

  1. 通过游戏学python 3.6 第一季 第二章 实例项目 猜数字游戏--核心代码--猜测次数 可复制直接使用 娱乐 可封装 函数

      猜数字游戏--核心代码--猜测次数   #猜数字--核心代码--猜测次数 number=33 amount=3 count=0 while count<=amount: conversion ...

  2. 通过游戏学python 3.6 第一季 第九章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆--账号的注册查询和密码的找回修改--锁定账号--锁定次数--菜单功能'menufile

      通过游戏学python 3.6 第一季 第九章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆--账号的注册查询和密码的找回修改--锁 ...

  3. 通过游戏学python 3.6 第一季 第八章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆--账号的注册查询和密码的找回修改--锁定账号--锁定次数

    通过游戏学python 3.6 第一季 第八章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆--账号的注册查询和密码的找回修改--锁定账 ...

  4. 通过游戏学python 3.6 第一季 第一章 实例项目 猜数字游戏--核心代码 可复制直接使用 娱乐 可封装 函数

    本文实例讲述了python实现的简单猜数字游戏.分享给大家供大家参考.具体如下: 给定一个1-99之间的数,让用户猜数字,当用户猜错时会提示用户猜的数字是过大还是过小,知道用户猜对数字为止,猜对数字用 ...

  5. 甲乙(数理逻辑)转自http://www.cnblogs.com/devymex/p/3329635.html

    这是一道历史悠久,又很困难的面试题. 你在旁观主持人和甲.乙两个天才数学家玩猜数字游戏.主持人准备了两个数,告知甲乙:这两个数不同,且大于等于1,小于等于30.然后主持人将两数之积告诉甲,把两数之和告 ...

  6. python 读取wav 音频文件的两种方式

    python 中,常用的有两种可以读取wav音频格式的方法,如下所示: import scipy from scipy.io import wavfile import soundfile as sf ...

  7. python中如何调用函数交换两个变量的值

    python中如何调用函数交换两个变量的值 所有代码来在python3.7.1版本实现 以下实例通过用户输入两个变量,并相互交换:  方法一: def swap(a,b): # 创建临时变量,并交换 ...

  8. Python 数据库的Connection、Cursor两大对象

    Python 数据库的Connection.Cursor两大对象 pymysql是Python中操作MySQL的模块,其使用方法和py2的MySQLdb几乎相同. Python 数据库图解流程 Con ...

  9. 今盒子里有n个小球,A、B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个

    /* 题目描述 今盒子里有n个小球,A.B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断. 我们约定: 每个人从盒子中取出的球 ...

随机推荐

  1. iOS,面试必看,最全梳理

    序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了.今年,找过工作人可能会更深刻地体会到今年的就业形势不容乐观,加之,培训机构一火车地向用人单位输送iOS开发人员,打破了生态圈的动态 ...

  2. Windows Service 之 安装失败后的删除

    一个windows服务在卸载之后并不会马上从服务列表中消失掉,而是在服务列表中会显示服务被禁用:这样在你需要再次安装同名服务时,就装不了了,会被提示同名的服务已经存在.如果是在本地安装,这种情况很容易 ...

  3. Sublime Text 2 实用快捷键[Mac OS X]

    lucasfais 总结了一些非常实用的 Sublime Text 2 快捷键,Lucifr 将它们翻译成了中文,以方便查阅. 注意:修饰键(如⌘)后跟多个按键的情况表示在按住修饰键的情况下依次按下相 ...

  4. LeetCode 258

    Add Digits Given a non-negative integer num, repeatedly add all its digits until the result has only ...

  5. HBase的JavaAPI操作

    如果是DDL的操作就找HbaseAdmin. 如果是表上的增删改查的操作就找HTable. 附录代码: mport java.util.Arrays; import org.apache.hadoop ...

  6. AngularJS 整理资料

    AngularJS是Google开源的一款JavaScript MVC框架,弥补了HTML在构建应用方面的不足,其通过使用指令(directives)结构来扩展HTML词汇,使开发者可以使用HTML来 ...

  7. CSS之图片关闭

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. Android手机播放电脑视频文件-屌丝必备

    今天早上一到办公室,照常打开博客园看文章,看到有一片文章是用  http://www.cnblogs.com/wdfrog/p/3738180.html 看到这哥们实现的方法好复杂,又是配置电脑端,又 ...

  9. SQL中PERSISTED关键字

    PERSISTED 指定 SQL Server 数据库引擎将在表中物理存储计算值,而且,当计算列依赖的任何其他列发生更新时对这些计算值进行更新.将计算列标记为 PERSISTED,可允许您对具有确定性 ...

  10. SQL server 2008 安装问题解决

    安装sqlserver2008 出现的一些问题解决方法 1,安装sqlserver的时候出现如下图所示,解决办法是:开始→运行→输入“regedit”→找到“HKEY_LOCAL_MACHINE\SY ...