潇湘夜雨57 发表于 2017-3-14 14:39

看到一个有趣的逻辑题目,于是用Java实现以下(ps:刚学Java没多久)


题目:
X和Y是二個整數,大於1,和小於等於100。S和P是兩個數學家,S知道兩者的和X+Y,P知道兩者的積X*Y,兩個人的邏輯都非常好,兩個人都知道上述的資訊,之後的對話如下:
[*]S說:「P不知道X和Y的值。」
[*]P說:「現在我知道X和Y的值。」
[*]S說:「現在也我知道X和Y的值。」
X和Y分別是多少?
代码实现:

import java.util.HashSet;

public class difficult {
        // hs1记录满足条件1的所有可能性
        static HashSet<Integer> hs1 = new HashSet<Integer>();
        // hs2记录满足条件2的所有可能性
        static HashSet<Integer> hs2 = new HashSet<Integer>();
        // hs3记录满足条件3的所有可能性
        static HashSet<Integer> hs3 = new HashSet<Integer>();
        // arr记录x,y的所有可能性
        static int[] arr = new int;

        public static void main(String[] args) {
                // S說:「P不知道X和Y的值。」
                tiaojian1();
                // P說:「現在我知道X和Y的值。」
                tiaojian2();
                // S說:「現在也我知道X和Y的值。」
                tiaojian3();
        }

        public static void tiaojian3() {
                /*S說:「現在也我知道X和Y的值。」------和分解成x+y(x>y),且x*y的解有且只有一个满足条件2
                1.hs1集合中和分解的x+y,有且只有一组满足条件2
                */
                // 遍历hs1,记录满足条件2的可能性数
                for (Integer s : hs1) {
                        int m = 0;
                        for (int x = s / 2; x < s - 1; x++) {
                                int y = s - x;
                                int p = x * y;
                                if (hs2.contains(p)) {
                                        m = m + 1;
                                        arr = x;
                                        arr = y;
                                }
                        }
                        // 用hs3记录hs1中的数分解为积的所有解,仅有一条满足条件2的p值的集合
                        if (m == 1) {
                                hs3.add(s);
                                System.out.println("x的为:" + arr +"---- "+"y的值为:" + arr);
                        }
                }

                // System.out.println(hs3);
        }

        public static void tiaojian2() {
                /*P說:「現在我知道X和Y的值。」------积分解成x*y(x>y),且x+y的解有且只有一个满足条件1
                1.x*y不能解不唯一,即至少有俩个不同的因子
                2.x+y的解有且只有一个满足条件1
*/
                for (int p = 5; p < 2500; p++) {
                        // m记录,p满足条件1的可能性数
                        int m = 0;
                        // n记录p因子的数量
                        int n = 0;
                        for (int x = 2; x * x <= p; x++) {
                                if (p % x == 0) {
                                        int y = p / x;
                                        int s = x + y;
                                        n = n + 1;
                                        if (hs1.contains(s)) {
                                                m = m + 1;
                                        }
                                }
                        }
                        if (n >= 2) {

                                if (m == 1) {
                                        hs2.add(p);
                                }
                        }
                }
                // System.out.println(hs2);
        }

        public static void tiaojian1() {
                /*S說:「P不知道X和Y的值。」------和分解成x+y(x>y),且x*y的解不唯一
                1.x,y不能同时为质数
                2.当y为质数时,y的平方不能等于x
*/
                for (int s = 4; s < 100; s++) {
                        // n记录p
                        int n = 0;
                        for (int x = s / 2; x < s; x++) {
                                int y = s - x;
                                boolean b1 = zhishu(x);
                                // 若x为质数,y等于x或者等于x的平方,值不满足条件1
                                if (b1 && (x == y || x == y * y)) {
                                        n = n + 1;
                                        continue;
                                }
                                boolean b2 = zhishu(y);
                                if (b1 && b2) {
                                        n = n + 1;
                                }
                        }
                        if (n == 0) {
                                hs1.add(s);
                        }
                }
                // System.out.println(hs1);
        }

        // 判断是否为质数,若为质数则返回true,否则为false
        static boolean zhishu(int x) {
                for (int i = 2; i < x; i++) {
                        if (x % i == 0) {
                                return false;
                        }
                }
                return true;
        }
}


欢迎大神提供更好的方法

0231121 发表于 2017-3-14 15:12

头好痛。 好像差不多是这样的

wenen 发表于 2017-3-14 17:02

其实我么怎么看懂{:1_903:}

cbjboss333 发表于 2017-3-14 17:27

太深奥了,看不懂!

潇湘夜雨57 发表于 2017-3-14 17:27

wenen 发表于 2017-3-14 17:02
其实我么怎么看懂

题目确实很绕

BURNER 发表于 2017-3-14 18:06

兄弟其他的不说,方法名用拼音实在是不太好,以后不要这样了

潇湘夜雨57 发表于 2017-3-14 22:09

BURNER 发表于 2017-3-14 18:06
兄弟其他的不说,方法名用拼音实在是不太好,以后不要这样了

但是不知道该起个什么名字能直观的反馈这个条件

一叶繁星 发表于 2017-3-15 20:59

看到拼音好感动。
英语不好,每次起方法变量名都要查字典。

潇湘夜雨57 发表于 2017-3-15 23:00

一叶繁星 发表于 2017-3-15 20:59
看到拼音好感动。
英语不好,每次起方法变量名都要查字典。

慢慢的就习惯了

meilon 发表于 2017-3-16 00:09

学java一个月,记住不少英文单词.....
页: [1]
查看完整版本: 看到一个有趣的逻辑题目,于是用Java实现以下(ps:刚学Java没多久)