Play with SQL (Mission 1)

feilniu 2010-08-17 02:14:15
加精
这是一些有趣的小问题。我们可以尝试用T-SQL来解答。
Just for fun!

大家回复时,别忘了贴出自己的代码,可以共同分享一下SQL的技巧和思维的火花。


1.
一个数学家和他多年未见的朋友在街上偶遇。朋友问:“今天对我来说是一个很特殊的日子,我的三个儿子都在今天过生日!你能算出来他们都有多大吗?”
“好,”数学家说,“但是你得跟我讲讲他们的情况。”
“好的,我给你一些提示,”那三个小孩的父亲说,“他们三个的年龄之积是36。”
“很好,”数学家说,“但我还需要更多的提示。”
“他们三个的年龄之和等于那幢房子的窗户个数。”朋友指着他们旁边的一幢房子说。
数学家考虑了一下说,“但是我还要一点信息来解你的这个难题。”
“我大儿子的眼睛是蓝色的。”朋友说。(注:如果两个儿子是双胞胎,则没有大小之分)
“哦,可以了。”数学说道。接着他给出了答案。
请问这三个小孩的年龄。

2. (这个题目貌似很有名)
教授选出两个从2到9的数,把它们的和告诉学生甲,把它们的积告诉学生乙,让他们轮流猜这两个数。
甲说:“我猜不出”
乙说:“我猜不出”
甲说:“我猜到了”
乙说:“我也猜到了”
请问这两个数是多少。
(提示:考虑这两个数是否允许相同,分两种情况)


以上两个题目,在SQL Server 2005上可用一个SQL查询给出答案。
...全文
676 52 打赏 收藏 转发到动态 举报
写回复
用AI写文章
52 条回复
切换为时间正序
请发表友善的回复…
发表回复
wyh0zf 2010-08-21
  • 打赏
  • 举报
回复
学习了
realgz 2010-08-20
  • 打赏
  • 举报
回复
窗户的问题只说明了在知道窗户个数的情况下还无法确定
iorange_y 2010-08-19
  • 打赏
  • 举报
回复
怎么算都是两个呀
xlh0053 2010-08-19
  • 打赏
  • 举报
回复
感觉这种题没意义
a093725846a 2010-08-19
  • 打赏
  • 举报
回复
看过 难。
一缕青烟 2010-08-19
  • 打赏
  • 举报
回复
窗户个数不知道。2个小儿子是否是双胞胎?
keer014 2010-08-19
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 guguda2008 的回复:]- -是我想错了,房子的窗户不一定是正方的,但轮回哥的窗户数取小了吧,我取的1到100还有一种可能是
36 1 1[/Quote]
满意 2010-08-19
  • 打赏
  • 举报
回复
我直到今天终于见到SQL牛人了!!!汗啊。。。!!

学习了。
macklau 2010-08-19
  • 打赏
  • 举报
回复
学习了
feilniu 2010-08-18
  • 打赏
  • 举报
回复
代码是思维的体现。如果程序的结果与手工计算的结果冲突了,那必定有一个的思维是有问题的。

你需要判断这是Developer的错还是QA的错。
feilniu 2010-08-18
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 guguda2008 的回复:]

我帖个别人的算法,反正我是看晕了。

SQL code

我还要反证 答案3和4是不对的
如果两个数是3和4 那么甲知道和为7 (25 34),乙知道积为12(26 34)
那么条件1和2都暂时成立 甲可以根据条件2 得出积不可能为10,因为那样乙不用甲说都知道.那么甲就得出 为3和4 条件3也成立

反过来 乙若猜 和=8(2+6)
甲有 26 35 甲可以根据条件2得出为26 条件3……
[/Quote]

这里证明的是,在不允许两数相等的情况下,34是不对的。


我还要反证 答案3和4是不对的
如果两个数是3和4 那么甲知道和为7 (25 34),乙知道积为12(26 34)
那么条件1和2都暂时成立 甲可以根据条件2 得出积不可能为10,因为那样乙不用甲说都知道.那么甲就得出 为3和4 条件3也成立

反过来 乙若猜 和=8(2+6)
甲有 26 35 甲可以根据条件2得出为26 条件3成立 --这里有问题,如果允许两数相等,44也满意条件3
乙若猜 和=7(3+4)
甲有 25 34 甲也可以据条件2得出为34 条件3成立
以上两种可能皆成立 那么条件4就肯定不能成立了
也就是说乙不可能根据条件3猜出数是多少来

也就是说如果是3和4的话 条件4限制,乙绝对不能说"我也猜到了"

因为两种可能都成立,所以结果3和4是不正确的!
realgz 2010-08-18
  • 打赏
  • 举报
回复
思考语句也贴出来吧,懒得想了(后面两列是为了辅助思考)

select top 8 identity(int,2,1) x into #t2 from syscolumns
go

select t1.x,t2.x ,(t1.x +t2.x),(t1.x *t2.x)
from #t2 t1, #t2 t2
where t1.x>=t2.x --老规矩,先排序
and (t1.x+t2.x )not in (4,5,17,18) --把知道和就能知道组合的去掉
and (t1.x * t2.x ) not in (select t1.x * t2.x from #t2 t1, #t2 t2 --把剩下范围中知道积就能唯一确定的去掉
where t1.x>=t2.x
and (t1.x+t2.x )not in (4,5,17,18)
group by ( t1.x * t2.x) having count(*)=1)
and (t1.x +t2.x) in --把知道何就知道两个值的取出来
(
select t1.x+t2.x
from #t2 t1, #t2 t2
where t1.x>=t2.x --老规矩,先排序
and (t1.x+t2.x )not in (4,5,17,18) --把知道和就能知道组合的去掉
and (t1.x * t2.x ) not in (select t1.x * t2.x from #t2 t1, #t2 t2 --把剩下范围知道积就能唯一确定的去掉
where t1.x>=t2.x --老规矩,先排序
and (t1.x+t2.x )not in (4,5,17,18) --把知道和就能知道组合的去掉
group by ( t1.x * t2.x) having count(*)=1)
group by ( t1.x + t2.x) having count(*)=1
)
and (t1.x *t2.x) not in --在这个结果范围里知道积 有2种以上可能性的干掉
(
select t1.x*t2.x
from #t2 t1, #t2 t2
where t1.x>=t2.x --老规矩,先排序
and (t1.x+t2.x )not in (4,5,17,18) --把知道和就能知道组合的去掉
and (t1.x * t2.x ) not in (select t1.x * t2.x from #t2 t1, #t2 t2 --把剩下范围中知道积就能唯一确定的去掉
where t1.x>=t2.x
and (t1.x+t2.x )not in (4,5,17,18)
group by ( t1.x * t2.x) having count(*)=1)
and (t1.x +t2.x) in --把知道何就知道两个值的取出来
(
select t1.x+t2.x
from #t2 t1, #t2 t2
where t1.x>=t2.x --老规矩,先排序
and (t1.x+t2.x )not in (4,5,17,18) --把知道和就能知道组合的去掉
and (t1.x * t2.x ) not in (select t1.x * t2.x from #t2 t1, #t2 t2 --把剩下范围知道积就能唯一确定的去掉
where t1.x>=t2.x --老规矩,先排序
and (t1.x+t2.x )not in (4,5,17,18) --把知道和就能知道组合的去掉
group by ( t1.x * t2.x) having count(*)=1)
group by ( t1.x + t2.x) having count(*)=1)
group by ( t1.x * t2.x) having count(*)>1
)

realgz 2010-08-18
  • 打赏
  • 举报
回复
不是
4,4 6,3
是4,3 6,3

汗,觉得思维没盲点了啊,想想
realgz 2010-08-18
  • 打赏
  • 举报
回复
1、
select top 36 identity(int,1,1) x into #t from syscolumns
go

select t1.x,t2.x,t3.x
from #t t1,#t t2,#t t3
where t1.x*t2.x*t3.x=36 --和
and t1.x>=t2.x and t1.x>=t2.x and t2.x>=t3.x --按照年龄排序
and (t1.x+t2.x+t3.x) in --只有一重情况在知道和的时候无法确定,就是和有多个
(select (t1.x+t2.x+t3.x) from #t t1,#t t2,#t t3
where t1.x*t2.x*t3.x=36
and t1.x>=t2.x and t1.x>=t2.x and t2.x>=t3.x group by (t1.x+t2.x+t3.x) having count(*)>1)
and t1.x>t2.x --有老大
go
2、我怎么算出两个答案?
4,4 6,3
bauer200 2010-08-18
  • 打赏
  • 举报
回复
对这种东西,最摸不着头绪了。。
fengxiaohan211 2010-08-18
  • 打赏
  • 举报
回复
不会用SQL处理。。
jbz001 2010-08-17
  • 打赏
  • 举报
回复
第一个很简单,分解因式,然后按题目组合就行了。
第二个有点晕~!
jenny0810 2010-08-17
  • 打赏
  • 举报
回复
太强了
guguda2008 2010-08-17
  • 打赏
  • 举报
回复
我帖个别人的算法,反正我是看晕了。


我还要反证 答案3和4是不对的
如果两个数是3和4 那么甲知道和为7 (25 34),乙知道积为12(26 34)
那么条件1和2都暂时成立 甲可以根据条件2 得出积不可能为10,因为那样乙不用甲说都知道.那么甲就得出 为3和4 条件3也成立

反过来 乙若猜 和=8(2+6)
甲有 26 35 甲可以根据条件2得出为26 条件3成立
乙若猜 和=7(3+4)
甲有 25 34 甲也可以据条件2得出为34 条件3成立
以上两种可能皆成立 那么条件4就肯定不能成立了
也就是说乙不可能根据条件3猜出数是多少来

也就是说如果是3和4的话 条件4限制,乙绝对不能说"我也猜到了"

因为两种可能都成立,所以结果3和4是不正确的!
obuntu 2010-08-17
  • 打赏
  • 举报
回复
学习。。
加载更多回复(31)

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧