一道微软公司的面试题目的算法实现
题目: 已知两个数字为1~30之间的数字,甲知道两数之和,乙知道两数之积,甲问乙:“你知道是 哪两个数吗?”乙说:“不知道”。乙问甲:“你知道是哪两个数吗?”甲说:“也不知道”。于是,乙说:“那我知道了”,随后甲也说:“那我也知道了”,这两个数是什么?
下边是最佳答案:
1和4 或者1和7
推理1:允许两数重复的情况下
答案为x=1,y=4;甲知道和A=x+y=5,乙知道积B=x*y=4
不允许两数重复的情况下有两种答案
答案1:为x=1,y=6;甲知道和A=x+y=7,乙知道积B=x*y=6
答案2:为x=1,y=8;甲知道和A=x+y=9,乙知道积B=x*y=8
解:
设这两个数为x,y.
甲知道两数之和 A=x+y;
乙知道两数之积 B=x*y;
该题分两种情况 :
允许重复, 有(1 <= x <= y <= 30);
不允许重复,有(1 <= x < y <= 30);
当不允许重复,即(1 <= x < y <= 30);
1)由题设条件:乙不知道答案
<=> B=x*y 解不唯一
=> B=x*y 为非质数
又∵ x ≠ y
∴ B ≠ k*k (其中k∈N)
结论(推论1):
B=x*y 非质数且 B ≠ k*k (其中k∈N)
即:B ∈(6,8,10,12,14,15,18,20...)
证明过程略。
2)由题设条件:甲不知道答案
<=> A=x+y 解不唯一
=> A >= 5;
分两种情况:
A=5,A=6时x,y有双解
A>=7 时x,y有三重及三重以上解
假设 A=x+y=5
则有双解
x1=1,y1=4;
x2=2,y2=3
代入公式B=x*y:
B1=x1*y1=1*4=4;(不满足推论1,舍去)
B2=x2*y2=2*3=6;
得到唯一解x=2,y=3即甲知道答案。
与题设条件:"甲不知道答案"相矛盾 ,
故假设不成立,A=x+y≠5
假设 A=x+y=6
则有双解。
x1=1,y1=5;
x2=2,y2=4
代入公式B=x*y:
B1=x1*y1=1*5=5;(不满足推论1,舍去)
B2=x2*y2=2*4=8;
得到唯一解x=2,y=4
即甲知道答案
与题设条件:"甲不知道答案"相矛盾
故假设不成立,A=x+y≠6
当A>=7时
∵ x,y的解至少存在两种满足推论1的解
B1=x1*y1=2*(A-2)
B2=x2*y2=3*(A-3)
∴ 符合条件
结论(推论2):A >= 7
3)由题设条件:乙说"那我知道了"
=>乙通过已知条件B=x*y及推论(1)(2)可以得出唯一解
即:
A=x+y, A >= 7
B=x*y, B ∈(6,8,10,12,14,15,16,18,20...)
1 <= x < y <= 30
x,y存在唯一解
当 B=6 时:有两组解
x1=1,y1=6
x2=2,y2=3 (∵ x2+y2=2+3=5 < 7∴不合题意,舍去)
得到唯一解 x=1,y=6
当 B=8 时:有两组解
x1=1,y1=8
x2=2,y2=4 (∵ x2+y2=2+4=6 < 7∴不合题意,舍去)
得到唯一解 x=1,y=8
当 B>8 时:容易证明均为多重解
结论:
当B=6时有唯一解 x=1,y=6当B=8时有唯一解 x=1,y=8
4)由题设条件:甲说"那我也知道了"
=> 甲通过已知条件A=x+y及推论(3)可以得出唯一解
综上所述,原题所求有两组解:
x1=1,y1=6
x2=1,y2=8
当x<=y时,有(1 <= x <= y <= 30);
同理可得唯一解 x=1,y=4
推理2:只有1和7
分析
因为乙先说知道,说明乙通过这个乘积可以确定一组唯一的数,而甲后说知道了,说明甲通过乙提供的信息及两数之和也能确定唯一的一组数
先看乘积
如果是1和4,则乘积为4,可分解为1*4,2*2,不是唯一的一组
如果是1和7,则乘积为7是质数,可以分解为1*7,是唯一的一组
如果是4和7,则乘积为28,可分解为,4*7,2*14,1*28,不是唯一的一组
如果是1和17,则乘积为17是质数,可分解为1*17,是唯一的一组
如果是4和17,则乘积为68,可分解为2*34(不符合条件),和4*17,是唯一的一组
如果是7和14,则乘积为98,可分解为49*2(不符合条件),和7*14,是唯一的一组
由此筛选出1和7,1和17,4和17,7和14
在看两数之和
如果是1和7,则和为8,可分解为,1+7,2+6,3+5,4+4
1、如果分解为2+6,则乘积为12,不能确定唯一的一组数相乘
2、如果分解为3+5,则乘积为15,不能确定唯一的一组数相乘
3、如果分解为4+4,则乘积为16,不能确定唯一的一组数相乘
4、如果分解为1+7,则乘积为7,能确定唯一的一组数相乘
因此1和7成立
如果是1和17,则和为18,可分解为1+17,2+16,3+15....9+9
其中,如果分解为1+17,则乘积为17,能确定唯一的一组数相乘
如果分解为5+13,则乘积为65,能确定唯一的一组数相乘
这样至少有两组解符合条件
因此1和17不成立
如果是4和17,则和为21
其中
如果分解为2+19,则乘积为38,能确定唯一的一组数相乘
如果分解为4+17,则乘积为68,能确定唯一的一组数相乘
这样至少有两组解符合条件
因此4和17不成立
如果是7和14,则和为21
其中
如果分解为2+19,则乘积为38,能确定唯一的一组数相乘
如果分解为4+17,则乘积为68,能确定唯一的一组数相乘
这样至少有两组解符合条件
因此4和17不成立
总上,只有1和7符合条件
推理3:由乙开始推理:2*2=4或1*4=4 假设是2和2的话,甲所得的数是4,那么甲就会想“2+2=4, 1+3=4,那么他(乙)就会认为我所的数是3或4,如果是3的话,那么我(甲)就知道结果 1*3=3,现在他(乙)不知道,那么只能是2*2=4,相信他(乙)现在也得出了这个结果。可是他(乙)还要反问我(甲)知不知道,那么就是说2*2=4这个结果不成立,那么只能是1*4=4
以下用VB。NET实现:
Dim NUM, SUM, PRODUCT As Int32
Dim Product1()() As Int32
Dim i, m, n, Sum1(3)() As Int32
Private Sub MyMain()
Product1 = Nothing
NUM = CInt(Me.TextBox1.Text)
GetSum1()
GetProduct1()
For m = 1 To NUM
For n = m To NUM
If SumOnly(m, n) Or ProductOnly(m, n) Then GoTo NextItem '不好意思用了个GOTO
SUM = m + n
PRODUCT = m * n
'甲的和产生的积中最多有(n -2)个是唯一积
If SUMtoPRODUCT_N_2(SUM) < 2 Then GoTo NextItem
'乙的积产生的和中有且只有一个满足1、不是唯一和 2、和产生的积中最多有(n -2)个是唯一积
'并且其余的和均满足 1、不是唯一和 2、有n-1个唯一积
If PROCUCTtoSUM(PRODUCT) Then
MsgBox(m.ToString() & " " & n.ToString())
End If
NextItem: Next
Next
End Sub
Private Sub GetSum1()
'产生唯一和并保存在数组中
ReDim Sum1(0)(1)
Sum1(0)(0) = 1
Sum1(0)(1) = 1
ReDim Sum1(1)(1)
Sum1(1)(0) = 1
Sum1(1)(1) = 2
ReDim Sum1(2)(1)
Sum1(2)(0) = NUM - 1
Sum1(2)(1) = NUM
ReDim Sum1(3)(1)
Sum1(3)(0) = NUM
Sum1(3)(1) = NUM
End Sub
Private Function SumOnly(ByVal N1 As Int32, ByVal N2 As Int32) As Boolean
'判断是否为唯一和
Dim i As Int32
For i = 0 To 3
If N1 = Sum1(i)(0) AndAlso N2 = Sum1(i)(1) Then Return True
Next
Return False
End Function
Private Sub GetProduct1()
'产生唯一积并保存在数组中
Dim tmp(NUM * NUM)() As Int32
For m = 1 To NUM '????????????????
For n = m To NUM '??????????????
Dim meme() As Int32 = tmp(m * n)
If meme Is Nothing Then
ReDim meme(2)
Else
ReDim Preserve meme(meme.Length + 1)
End If
meme(meme.Length - 1) = m
meme(meme.Length - 2) = n
meme(0) += 1
tmp(m * n) = meme
meme = Nothing
Next
Next
For i = 1 To NUM * NUM
If Not tmp(i) Is Nothing AndAlso tmp(i)(0) = 1 Then
For m = 1 To tmp(i).GetUpperBound(0) Step 2
If Product1 Is Nothing Then
ReDim Product1(0)
ReDim Product1(0)(1)
Else
ReDim Preserve Product1(Product1.Length)
ReDim Product1(Product1.Length - 1)(1)
End If
Product1(Product1.Length - 1)(0) = tmp(i)(m)
Product1(Product1.Length - 1)(1) = tmp(i)(m + 1)
Next
End If
Next
End Sub
Private Function ProductOnly(ByVal N1 As Int32, ByVal N2 As Int32) As Boolean
'判断是否为唯一积
Dim i As Int32
For i = 0 To Product1.GetUpperBound(0)
If N1 = Product1(i)(1) AndAlso N2 = Product1(i)(0) Then Return True
If N1 = Product1(i)(0) AndAlso N2 = Product1(i)(1) Then Return True
Next
Return False
End Function
Private Function SUMtoPRODUCT_N_2(ByVal SUM As Int32) As Int32
'甲的和产生的积中最多有(n -2)个是唯一积
Dim n As Int32 = CInt(SUM / 2 - 0.2)
Dim i, m As Int32
For i = 1 To n
If ProductOnly(i, SUM - i) Then m += 1
Next
Return n - m
End Function
Private Function PROCUCTtoSUM(ByVal PRODUCT As Int32) As Boolean
'乙的积产生的和中有且只有一个满足1、不是唯一和 2、和产生的积中最多有(n -2)个是唯一积
'并且其余的和均满足 1、不是唯一和 2、有n-1个唯一积
Dim tmp()(), i, m, n As Int32
'1、分解积看能产生多少个和
For i = 1 To CInt(Math.Sqrt(PRODUCT) - 0.4)
If PRODUCT Mod i = 0 Then
If tmp Is Nothing Then
ReDim tmp(0)
ReDim tmp(0)(2)
Else
ReDim Preserve tmp(tmp.Length)
ReDim Preserve tmp(tmp.Length - 1)(2)
End If
tmp(tmp.Length - 1)(2) = PRODUCT / i
tmp(tmp.Length - 1)(1) = i
If Not SumOnly(tmp(tmp.Length - 1)(1), tmp(tmp.Length - 1)(2)) And SUMtoPRODUCT_N_2(i + PRODUCT / i) >= 2 Then
'和不为唯一和,且和产生的积中支多有n-2个是唯一积
tmp(tmp.Length - 1)(0) = 1
End If
If SumOnly(tmp(tmp.Length - 1)(1), tmp(tmp.Length - 1)(2)) Then
'唯一和
tmp(tmp.Length - 1)(0) = 3
End If
If Not SumOnly(tmp(tmp.Length - 1)(1), tmp(tmp.Length - 1)(2)) And SUMtoPRODUCT_N_2(i + PRODUCT / i) = 1 Then
'不是唯一和,但是有n-1个唯一积
tmp(tmp.Length - 1)(0) = 2
End If
End If
Next
Dim count As Int32 = 0
For i = 0 To tmp.Length - 1
If tmp(i)(0) = 0 Then Return False
If tmp(i)(0) = 1 Then count += 1
Next
If count <> 1 Then Return False
Return True
End Function
转载于:https://www.cnblogs.com/cuihongyu3503319/archive/2006/11/25/571851.html
一道微软公司的面试题目的算法实现相关推荐
- 淘宝,微软,IBM等公司笔试,面试题目
①淘宝笔试题目 题目大意如下:请使用C语言完成strnicmp的编码实现,要求不能调用任何其他函数.strcicmp完成两个ascii字符串的比较,忽略大小写(两个英文字母比时,认为大小写无差别),最 ...
- 微软公司招聘智力题目
微软公司招聘智力题目 很有意思大家可以试试!微软公司招聘智力题目 1.某手机厂家由于设计失误,有可能造成电池寿命比原来设计的寿命短一半(不是冲放电时 间),解决方案就是免费更换电池或给50元购买该厂家 ...
- 各公司 Java 面试题目整理(基础+高级+算法+数据库)
包含 Java 面试的各个方面,史上最全,苦心整理最全 Java 各公司面试题目整理包括但不限于基础+高级+算法+数据库优化+算法优化,使用层面广,知识量大,涉及你的知识盲点.要想在面试者中出类拔萃就 ...
- 各大公司硬件面试题目
各大公司的硬件笔试题 f) 画出微机接口电路中,典型的输入设备与微机接口逻辑示意图(数据接口.控制接口.所存器/缓冲器) 3. 设想你将设计完成一个电子电路方案.请简述用EDA软件(如PROTEL)进 ...
- 一道很有意思的面试题目,快加入到这场头脑风暴游戏里吧~
小伙伴们,小叶秋最近看到一个面试题目,感觉挺有意思的,大意如下: ok,大家看到这个题,可以先理解下,这里启动了两个线程,a 和 b,但是虽然说 a 在 b 之前 start,不一定就可以保证线程 a ...
- 2011 各大IT公司笔试面试题目
2011.10.17百度面试题 1.进程切换需要注意哪些问题? 保存处理器PC寄存器的值到被中止进程的私有堆栈: 保存处理器PSW寄存器的值到被中止进程的私有堆栈: 保存处理器SP寄存 ...
- 2022最新百度、头条等公司Android面试题目,2022年安卓社招面试题精选
开头 每到"金三银四"的季节,总人很多人去寻找名叫"面经"一样的东西,其实就是一个个具体的题目,然后临阵磨枪,去"背"答案,如果一直是这样的 ...
- 2011各大IT公司笔试面试题目
2011.10.17百度面试题 1.进程切换需要注意哪些问题? 保存处理器PC寄存器的值到被中止进程的私有堆栈: 保存处理器PSW寄存器的值到被中止进程的私有堆栈: 保存处理器SP寄存 ...
- 经典算法面试题目-设计算法移除字符串中重复的字符(1.3)
题目 Design an algorithm and write code to remove the duplicate characters in a string without using a ...
最新文章
- 精心整理,机器学习的3大学习资源
- 作为我的第一篇csdn博客吧
- React入门-9.redux你好
- TCP为何采用三次握手来建立连接,若采用二次握手可以吗
- 第7章 现代操作系统
- Ceph Block Device块设备操作
- [Swift]LeetCode1023. 驼峰式匹配 | Camelcase Matching
- 强烈推荐12套开源微信小程序免费源码
- linux视频字幕下载工具,Linux中编辑视频字幕
- 《Python金融大数据风控建模实战》 第15章 神经网络模型
- 2018年世界计算机超算大赛,2018ASC世界大学生超算竞赛开赛:11队齐破赛会纪录...
- 初夏小谈:浅谈字节序,TCP,UDP协议
- 智能运维|AIRIOT智慧光伏管理解决方案
- itunes怎么下载,有什么好的教程
- 管道通信的基本流程和代码
- C++源代码单词扫描程序(词法分析)
- IOS之YYModel字典转模型第三方框架的使用
- 在线听著名英文原版小说(朗读版超赞)
- 图观目前各类芯片的交货周期
- [iOS开发]iOS中的Hash
热门文章
- python mount回调函数_让Python脚本暂停执行的几种方法(小结)
- php time相差12小时_PHP服务器时间差8小时解决方案
- c# xml文件新增同级节点_[C#.NET 拾遗补漏]08:强大的LINQ
- 利用usb远程控制linux,Linux编程控制硬件(5) ---- 操作USB手柄
- python使用install_用 python setup.py install 安装 matplotlib 报错
- java 生成缩略图_Java实现等比例缩略图
- 计算机网络-基本概念(7)【网络层】-多协议标记交换MPLS
- 用Python轻松开发数据库取数下载工具
- 分享珍藏很久的Python学习知识手册
- android版本sdk api对应,Android API Level与sdk版本对照表