| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付学习型 ASP/PHP/ASP.NET 主机 30元/年
高端软件开发 = 年薪十万不是梦赛孚耐:软件保护加密专家身份认证令牌USB KEY 
共有 1374 人关注过本帖
标题:关于鬼谷子问徒
收藏  订阅  推荐  打印 
泉此方
Rank: 2
等级:注册会员
帖子:89
积分:1054
注册:2008-6-10
关于鬼谷子问徒

昨天simpley找我说的,说原经典答案不对,记录如下:

simpley 20:06:53
   你知道答案吗
simpley 20:07:42
   通常的答案是4和13
simpley 20:08:09
   但我可以证明别的数也可以

尐嚥籹 20:45:34
   然后呢,你还找到什么解?
simpley 20:46:24
   13,16
simpley 20:47:52
   共4个,有的推理把它们排除了,其逻辑是很荒谬的

我觉得有点奇怪,昨天做完我的作业后,玩完我的游戏后,在无聊之际决定写一下解题,
结果10分钟写好后,意外发现这个直接写比构造状态机好写得多
刚刚又修改了一下,运行以后发现。。。。Orz
我的代码如下:
/*****************************************************************
** HighlightCodeV3.0 software by yzfy(雨中飞燕) http://yzfy.org **
*****************************************************************/
/*
鬼谷子问徒[经典]
孙膑,庞涓都是鬼谷子的徒弟。一天鬼谷子出了这道题目:
他从2到99中选出两个不同的整数,把积告诉孙膑,把和告诉庞涓;
庞涓说:我虽然不能确定这两个数是什么,但是我肯定你也不知道这两个数是什么。
孙膑说:我本来的确不知道,但是听你这么一说,我现在能够确定这两个数字了。
庞涓说:既然你这么说,我现在也知道这两个数字是什么了。
请问这两个数字是什么?为什么?
*/
/*
以下代码,条件1-3分别对应两人依次说的三句话
算法采用最直接最容易理解的穷举验证法
*/

//是否唯一分解(附加条件:分解出的数小于100)
int isOneSolve(int n, int nMax = 100)
{
   
int nRet=0; //记录满足本条件数
   
for (int nd=2; nd*nd<n; ++nd)
    {
        
if ( n%nd==0 && n/nd<nMax)
            if (++nRet>1) return 0;
    }
   
return nRet;
}
//条件1,sum的任意和的分拆之积不可能有唯一分解,否则对方可能猜出
int p1(int sum)
{
   
if(sum<6) return 0;
    for (int t=(sum-1)/2; t>1; --t)
    {
        
if ( isOneSolve(t*(sum-t)) ) return 0;
    }
   
return 1;
}
//条件2,只有一种积的分拆满足条件1
int p2(int times2)
{
   
int nRet=0; //记录满足本条件数
   
for (int nd=2; nd*nd<times2; ++nd)
    {
        
if ( times2%nd==0 && p1(nd+times2/nd) )
            if (++nRet>1) return 0;
    }
   
return nRet;
}
//条件3,只有一种和的分拆满足条件2
int p3(int sum)
{
   
int nRet=0; //记录满足本条件数
   
for (int t=(sum-1)/2; t>1; --t)
    {
        
if ( p2(t*(sum-t)) )
            if (++nRet>1) return 0;
    }
   
return nRet;
}

#include <stdio.h>
//作者:雨中飞燕
int main(int argc, char *argv[])
{
   
for (int n=6; n<200; ++n) //穷举和的可能,最大不超过200
   
{
        
// 其和能同时满足条件1和3者即为结果
        
if (p1(n) && p3(n))
        {
            
//找出对应解
            
for (int t=2; t*2<n; ++t)
            {
               
if ( p2(t*(n-t)) ) //分拆结果符合条件2就输出
                    
printf("%d %d\n", t, n-t);
            }
        }
    }
   
puts("Finish");getchar();return 0;
}
运行结果是什么自己运行看看吧,结果没找到13,16
不太清楚simpley所说的另外还有哪三个解?


[color=white]

[ 本帖最后由 泉此方 于 2008-6-12 16:07 编辑 ]
搜索更多相关主题的帖子: 鬼谷子  yzfy  经典  游戏  推理  
2008-6-12 08:05
泉此方
Rank: 2
等级:注册会员
帖子:89
积分:1054
注册:2008-6-10

特别注意代码注释中题目描述的红色部分。。。
另外,程序代码的推理方式有错不?

[color=white]

[ 本帖最后由 泉此方 于 2008-6-12 08:23 编辑 ]

#ifdef _LOLICON_
#include"Loli"  //http://yzfy.org
#endif
2008-6-12 08:20
simpley
Rank: 3Rank: 3
等级:中级会员
帖子:261
积分:2826
注册:2005-2-23

肯定错

myQQ::445750010
2008-6-12 10:25
sunkaidong
Rank: 12Rank: 12Rank: 12
来自:南京师范大学
等级:版主
威望:4
帖子:4131
积分:44881
注册:2006-12-28

楼上为什么肯定错了?燕子你找素数好像找不全,17*17

学习需要安静。。海盗要重新来过。。
2008-6-12 10:40
泉此方
Rank: 2
等级:注册会员
帖子:89
积分:1054
注册:2008-6-10

sunkaidong 在 2008-6-12 10:40 的发言:

楼上为什么肯定错了?燕子你找素数好像找不全,17*17
如果你计算结果是17*17<200,那我的程序的确有错



[color=white]

#ifdef _LOLICON_
#include"Loli"  //http://yzfy.org
#endif
2008-6-12 12:11
泉此方
Rank: 2
等级:注册会员
帖子:89
积分:1054
注册:2008-6-10

simpley 在 2008-6-12 10:25 的发言:

肯定错
你光会说肯定错是没有用的



[color=white]

#ifdef _LOLICON_
#include"Loli"  //http://yzfy.org
#endif
2008-6-12 12:14
卧龙孔明
Rank: 12Rank: 12Rank: 12
等级:版主
威望:47
帖子:3702
积分:39046
注册:2006-10-13

思考错了,当我没说.......

[ 本帖最后由 卧龙孔明 于 2008-6-12 12:42 编辑 ]

为了中国软件工业的未来,有爱心的朋友请不要帮忙代做作业,或者至少是收费服务!如果您不需要钱,或者您不愿收费用于自己,请把收取的钱用于支援山区贫困学生…谢谢大家!
2008-6-12 12:31
卧龙孔明
Rank: 12Rank: 12Rank: 12
等级:版主
威望:47
帖子:3702
积分:39046
注册:2006-10-13

飞燕的程序也有问题
“2到99中选出两个不同的整数”
但是解中出现了超过100的数

为了中国软件工业的未来,有爱心的朋友请不要帮忙代做作业,或者至少是收费服务!如果您不需要钱,或者您不愿收费用于自己,请把收取的钱用于支援山区贫困学生…谢谢大家!
2008-6-12 12:39
泉此方
Rank: 2
等级:注册会员
帖子:89
积分:1054
注册:2008-6-10

我承认之前的代码是错的,偶开始对第一句话(庞涓)的理解出现了偏差
第二第三句都没有问题,第二三两个条件相应的函数没有改动过
第一个条件修改后,运行出来那个结果非常漂亮


[color=white]

[ 本帖最后由 泉此方 于 2008-6-12 13:56 编辑 ]

#ifdef _LOLICON_
#include"Loli"  //http://yzfy.org
#endif
2008-6-12 12:52
lingluoz
Rank: 4
来自:苏州科技学院
等级:高级会员
威望:3
帖子:623
积分:6680
注册:2008-2-2

好强啊。。。我想了半天也写不出来啊 。。

MAY 1, 1964 -- The Birth of BASIC
Over 40 years later, it still enables ANYONE to write their own programs.
P.S. 革命尚未成功 同志仍需努力
2008-6-12 14:55
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.064497 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved