QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: atfa

挑战你的智力极限

[复制链接]
发表于 2004-3-1 19:47:15 | 显示全部楼层
[code:1]
/*
* Created on 2003-11-23
*
* 一日,鬼谷子在2--100这99个数字中选了2个数字,然后把它们的和告诉了庞涓,
* 把积告诉了孙膑。当然,庞涓不知道积是多少,孙膑不知道和是多少。 第二日,
* 庞涓遇见孙膑很傲慢的对孙膑说:"虽然我不知道这两个数是多少但是我肯定你
* 也不知道。"孙膑立刻还击道:"本来我不知道的,但是现在我知道这两个数是多
* 少了。"庞涓想了一 会,说道:"现在我也知道这两个数是多少了。"   
* 请问这二个数各是多少?
*/

/**
* @author mhx
* @exception Exception
* To change the template for this generated type comment go to
* Window - Preferences - Java - Code Generation - Code and Comments
*/

import java.util.*;
class ETwoEqualNumber extends Exception{}
class EInvalidParam extends Exception{}

class IntPair{
        public IntPair(int i1,int i2)throws ETwoEqualNumber{
                if(i1 == i2)
                        throw new ETwoEqualNumber();
                n1 = i1;
                n2 = i2;       
        }
        public String toString(){
                return "{"+Integer.toString(n1) +" & " +Integer.toString(n2)+"}";
        }
        public int hashCode(){
                return n1 + n2;
        }
        public boolean equals(Object o){
               
                boolean res = (o instanceof IntPair) && (
                  ((IntPair)o).n1 == n1 && ((IntPair)o).n2 == n2
                  ||
                  ((IntPair)o).n1 == n2 && ((IntPair)o).n2 == n1
                );
                return res;       
        }
        public int sum(){
                return n1 + n2;
        }
        public int mult(){
                return n1 * n2;
        }
        int n1;
        int n2;
       
        public static void main(String [] args)throws Exception{
                HashSet hs = new HashSet();
                hs.add(new IntPair(2,3));
                hs.add(new IntPair(3,2));
                hs.add("x");
                hs.add("x");
       
                System.out.println(hs);
               
        }
}
public class Answer {
        static HashSet getIntPairsBySum(int sum)throws EInvalidParam{
          if (sum < (2*smallNumber + 1)|| sum > (2*bigNumber - 1))
                  throw new EInvalidParam();
          HashSet hs = new HashSet();
          int top = Math.min(sum/2,bigNumber);
          for (int i = smallNumber; i <= top;i++)
                  if (i != sum - i)
                          try{
                                  hs.add(new IntPair(i,sum - i));
                          }catch(ETwoEqualNumber e){
                                  System.err.println(e);
                          }
          return hs;       
        }
        static HashSet getIntPairsByMult(int mult)throws EInvalidParam{
                if(mult <(smallNumber * (smallNumber + 1)) || mult > (bigNumber * (bigNumber - 1)))
                        throw new EInvalidParam();
                HashSet hs = new HashSet();
                for(int i = smallNumber;i < bigNumber;i++){
                        if (mult%i == 0 && i != mult/i && mult/i >= smallNumber && mult/i <= bigNumber)
                                try{
                                        hs.add(new IntPair(i,mult/i));
                                }catch(ETwoEqualNumber e){
                                System.err.println(e);
                                }       
                               
                }
                return hs;       
        }
        public static void usage(){
                System.out.println("USAGE:");
                System.out.println("java Answer smallNumber bigNumber");
                System.out.println("such as: java Answer 2 100");
                System.exit(0);
        }
        public static void main(String[] args) throws Exception{
                //check params
                if (args.length != 2)
                        usage();
                try{
                        smallNumber = Integer.parseInt(args[0]);
                        bigNumber = Integer.parseInt(args[1]);
                        if (smallNumber >= bigNumber)
                                throw new Exception();
                }catch(Exception e){
                        usage();
                }
               
               
                HashSet hs1,hs2;
                HashSet sums = new HashSet();
               
                F1:
                for (int i = (2*smallNumber + 1);i <= (2*bigNumber - 1);i++){
                        hs1 = getIntPairsBySum(i);
                        Iterator it1 = hs1.iterator();
                       
                        while(it1.hasNext()){
                                IntPair ip = (IntPair)it1.next();
                                hs2 = getIntPairsByMult(ip.mult());
                       
                                if (hs2.size() <= 1)
                                        continue F1;
                        }
                        sums.add(new Integer(i));
                }
               
                System.out.print("possible sums :" + sums);
                System.out.println(" count = "+sums.size());
                HashSet mults = new HashSet();
                F2:
                for (int i = (smallNumber * (smallNumber + 1));i<=(bigNumber * (bigNumber - 1));i++){
                        hs1 = getIntPairsByMult(i);
                        Iterator it1 = hs1.iterator();
                        int count = 0;
                        while(it1.hasNext()){
                                IntPair ip = (IntPair)it1.next();
                                if (sums.contains(new Integer(ip.sum()))){
                                        count++;
                                }       
                                if (count >=2)
                                        continue F2;
                        }
                        if (count == 1){
                                mults.add(new Integer(i));
                        }
                }
                System.out.print("possible multiplies :" +mults);
                System.out.println(" count = "+mults.size());
               
                HashSet result = new HashSet();
                Iterator it = sums.iterator();
                W:
                while(it.hasNext()){
                        int val = ((Integer)it.next()).intValue();
                        HashSet hs = getIntPairsBySum(val);
                        Iterator it1  = hs.iterator();
                        int count = 0;
                        IntPair ip = null;
                        IntPair ip2 = null;
                        while(it1.hasNext()){
                                ip = (IntPair)it1.next();
                                if (mults.contains(new Integer(ip.mult()))){
                                        count++;
                                        ip2 = ip;
                                }       
                                if (count >= 2)
                                        continue W;
                        }
                        if (count == 1){
                                if (ip == null)
                                        throw new Exception("impossible! count is 1,but ip is null!");
                                result.add(ip2);
                        }
                }
                System.out.println("===================================");
                if (result.size() != 1){
                        System.out.println("sorry,i can\'t find out the answer!");
                }else{
                        System.out.println("the Answer is:" + result.iterator().next());
                }
        }
        private static int smallNumber = 0;
        private static int bigNumber = 1;
}
[/code:1]
回复

使用道具 举报

发表于 2004-3-18 09:29:13 | 显示全部楼层
                          :neutral:    :-)  :-(        
回复

使用道具 举报

发表于 2004-7-2 08:01:22 | 显示全部楼层
一分钟想出来了
回复

使用道具 举报

发表于 2004-7-4 09:43:26 | 显示全部楼层
我的结果也是方块 5
回复

使用道具 举报

发表于 2004-7-5 23:07:07 | 显示全部楼层
[quote:e64619dc11="moonsky"]下面出一题,如找出答案的,智商起码达到140:
P先生、Q先生都具有足够的推理能力。这天,他们正在接受推理面试。
他们知道桌子的抽屉里有如下16张扑克牌:
红桃   A、Q、4
黑桃   J、8、4、2、7、3
草花   K、Q、5、4、6
方块   A、5
约翰教授从这16张牌中挑出一张牌来,并把这张牌的点数告诉P先生,把这张牌的花色告诉Q先生。这时,约翰教授问P先生和Q先生:你们能从已知的点数或花色中推知这张牌是什么牌吗?
P先生:"我不知道这张牌。" Q先生:"我知道你不知道这张牌。"
P先生:"现在我知道这张牌了。" Q先生:"我也知道了。" 请问:这张牌是什么牌?[/quote]

第一步:P先生:"我不知道这张牌。"排除了唯一点数的牌,这一步是确定有依据的,通过自己掌握的信息得出可靠的推论;
第二步:Q先生:"我知道你不知道这张牌。" 此时剩下的牌(9张)里每张都有可能(对P先生来说),P先生只能根据点数确定可能的花色(4种花色),他如何能确定具体哪张呢?进行到这一步时他没办法!Q先生能确定什么东西呢?对于他知道的花色来讲,同样需要确定点数,同样他也没办法!因为此时Q先生不知道P先生牌的具体点数。反推一下既然(Q先生:"我知道你不知道这张牌。")Q先生知道P先生所不知道的,那么他能否确定P先生所知道的呢?如果能确定,那以后几步就没了意义!?!?
第三步:P先生:"现在我知道这张牌了。"好了,到了这一步P先生知道了那张牌,怎么知道的?因为Q先生(Q先生:"我知道你不知道这张牌。")传递了某些信息让P先生得出了确定的推论,而此推论是建立在Q先生推论之上的。
第四步:Q先生:"我也知道了。" 晕呀,显而易见的Q先生的推论是建立在P先生的推论基础之上的。
那么问题的关键就是第二步( Q先生:"我知道你不知道这张牌。" )!既:Q先生是如何知道P先生所不知道的牌呢?而P先生无法确定的牌有9张!
如果推论的结果是真实的,推论的过程是可以推敲的。也就是说:第四步的推论建立在第三步的推论之上,第三步的推论建立在第二步的推论之上,第二步的推论建立在第一步的推论之上。假如第一步的推论是正确的,的确如此,可以证明第四步同样是正确的,问题是第二步,分解一下:1、P先生无法确定的牌(9张);2、Q先生知道P先生无法确定的牌。问题在2:Q先生如何知道P先生无法确定的4类9张牌呢???

我也想有140以上的智商,但是我知道对确定问题的分析要讲根据。个人认为此例有互相论证之嫌!
回复

使用道具 举报

发表于 2004-7-7 17:10:36 | 显示全部楼层
我想不明白。为什么和是17积是52的。
庞娟(知道和)说,自己不知道,对方也不知道。
孙宾(知道积)说,本来不知道,现在知道。(对52来说,可以分解成4×13, 2×26)
孙膑怎么会知道的???孙宾是如何去掉另外一种可能性的?
我觉得无论庞娟手中和是17还是28,都可以说自己不知道,对方也不知道。而孙膑怎么就
知道一定是17了?
回复

使用道具 举报

发表于 2004-7-8 09:46:56 | 显示全部楼层
本例可以这样分析,很容易理解。下面用kill N(表示根据第N句话将其排除)。
按数字和花色都分好类。
按数字:
2: 黑(kill 1)
3: 黑(kill 1)
4: 红、黑(kill 2)、草(kill 2)
5: 草(kill 2)、方
6: 草(kill 1)
7: 黑(kill 1)
8: 黑(kill 1)
j: 黑(kill 1)
Q: 红、草(kill 2)
k:草(kill 1)
A: 红(kill 3)、方(kill 3)

花色:
红桃 A(kill 3)、Q(kill 4)、4(kill 4)
黑桃 J(kill 2)、8(kill 1)、4(kill 2)、2(kill 1)、7(kill 1)、3 (kill 1)
草花 K(kill 1)、Q(kill 2)、5(kill 2)、4(kill 2)、6(kill 1)
方块 A(kill 3)、5

第一句话:p(知道数字)不知道。故说明不能是数字对应单一花色,排除如上。
第二句话:q(知道花色)知道p不知道。说明q手中牌花色对应的所有有可能的数字都不能
          是单花色的。如:如果q手中是草花的话,他就不能能那么肯定的说知道p不道,因为q如果是草花6或者k的话,q就知道了是什么了。同理,q手中是黑桃也是这样的。通过这一句可以排除不是黑桃和草花。
第三句话:p说我现在知道了。说明p知道的点数肯定不是A, 因为A这个时候还对应两种花色。(注意:在这里,我们处于第三方的角度,不知道花色也不知道点数,所以,仍然不知道是什么数字)
第四句话:q说我也知道了。说明q知道的花色肯定不是红桃,因为,红桃还存在两个数字。
到这个时候,对于第三方的我们才知道这个数字是方片5,也就是说我们是最后知道的,^_^。
回复

使用道具 举报

发表于 2004-7-8 12:46:18 | 显示全部楼层
扑克牌问题

分析结果如下:知道点数的p先生可以推出的情况是
红桃: A、Q、4     
黑桃 :4   
草花 :Q、5、4、   
方块 :A、5

              只有重复出现的数字才会让知道点数的p先生不能确定是那一张牌

而知道花色的Q先生得出的结果当然是他所知道花色的任意一组:红 黑 花 方
  
          这里是关健:当Q向p提示道“我知道你不知道”因为Q知道p没有拿到不重复的

牌,在此时说他已知道是什么牌, 而能让p明确的牌也就只有一张 黑桃4   

         因此得出这张牌就是  《 黑 桃 4 》

不知道 分析是否正确  大家讨讼一下
回复

使用道具 举报

发表于 2004-7-10 13:04:13 | 显示全部楼层
我也觉得是方块5
回复

使用道具 举报

发表于 2004-7-12 00:15:14 | 显示全部楼层
一天鬼谷子出了这道题目:他从2到99中选出两个不同的整数,把积告诉孙膑,把和告诉 庞涓;
庞涓说:我虽然不能确定这两个数是什么,但是我肯定你也不知道这两个数是什么。
孙膑说:我本来的确不知道,但是听你这么一说,我现在能够确定这两个数字了。
庞涓说:既然你这么说,我现在也知道这两个数字是什么了。

1、庞根据和说孙“肯定”不知道推出,这个和肯定不能分解成这样两个数:它们的乘积只能分解成这两个数自身。应用歌德巴赫猜想:任何一个大于2的偶数肯定能分解成两个质数的和,所以,和肯定是奇数。所以这两个数一奇,一偶。
2、孙说本来不知道,现在知道了。说明这两个数的乘积可以分解成多种偶数相乘和唯一的一个质数乘以偶数。为什么呢?首先,孙现在知道是一个奇数和一个偶数了,那么他的积肯定只有一种情况产生奇数和偶数,并且奇数必须是质数(因为如果不是质数,则有多种奇数的情况)。再考虑偶数是什么情况。这里偶数必须是2的n次幂,因为如果不是2的n次幂则可能出现这个偶数分解成2的n次幂乘以一个奇数的形式,这样也就出现了多种奇数的情况(这个应该比较好理解)。
3、因为庞根据孙说知道了,也推出一个质数和一个2的n次幂偶数。庞说知道,说明和也只能表示成唯一的2的n次幂与一个质数的和。
4、接着就该们来判断了。我们从和等于3开始判定,5=2+3(这个肯定不可能。庞知道和就知道了)
7=3+4, 2+5(庞不能推出来,肯定不是)
9=2+7,4+5(同上)
11 = 4+7,8+3(同上)
13 = 2+11,8+5(同上)
15=2+13, 4+11, 8+7(同上)
17=4+13(满足要求)
然后可以验证,当奇数很大的时候很容易分解成多种情况。
所以推出来这两个数是4和13。
回复

使用道具 举报

发表于 2004-7-19 10:20:13 | 显示全部楼层
第一句:我知道你不知道,可以得出可能是
红桃:A   4      Q
黑桃:   4
草花:   4  5  Q
方块:A    5
第二句:我知道你不知道+现在我知道是哪张,可以得到:
回复

使用道具 举报

发表于 2004-10-27 14:38:06 | 显示全部楼层
呵呵,人的智商真的能测出来吗
回复

使用道具 举报

发表于 2004-10-30 22:17:45 | 显示全部楼层
方块五
回复

使用道具 举报

发表于 2004-11-3 18:49:44 | 显示全部楼层
[quote:fb2f18efd8="moonsky"]下面出一题,如找出答案的,智商起码达到140:
P先生、Q先生都具有足够的推理能力。这天,他们正在接受推理面试。
他们知道桌子的抽屉里有如下16张扑克牌:
红桃   A、Q、4
黑桃   J、8、4、2、7、3
草花   K、Q、5、4、6
方块   A、5
约翰教授从这16张牌中挑出一张牌来,并把这张牌的点数告诉P先生,把这张牌的花色告诉Q先生。这时,约翰教授问P先生和Q先生:你们能从已知的点数或花色中推知这张牌是什么牌吗?
P先生:"我不知道这张牌。" Q先生:"我知道你不知道这张牌。"
P先生:"现在我知道这张牌了。" Q先生:"我也知道了。" 请问:这张牌是什么牌?[/quote]

    
一定是黑桃4!!
    
能不能用程式来实现啊?大家想想!!我有时间一定试试

XXXXXXz1...2..3.4..5..6..7..8..9..10..11..12..13   
Q:a=红桃 a..........4....................................Q
  b=黑桃......2..3..4..........7..8.............J
  c=草花..............4..5..6............................Q...K
  d=方块a................5


P:2个a,2个Q,3个4,一个(J8273K6),2个5
Q:a=红桃,b=黑桃.c=草花.d=方块
P先生:"我不知道这张牌"得出P不会是(J8273K6)中的一个,就会是AQ45中的一的                        
a=红桃a.............4....................................Q
b=黑桃..............4               
c=草花..............4..5................................Q   
d=方块a................5

而Q先生:"我知道你不知道这张牌。"得出Q知是哪只的!!那就是只有黑桃是只有一种选择___黑桃4
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-11-7 05:25 , Processed in 0.083012 second(s), 12 queries .

© 2021 Powered by Discuz! X3.5.

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