吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3917|回复: 9
收起左侧

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

[复制链接]
潇湘夜雨57 发表于 2017-3-14 14:39

题目:
X和Y是二個整數,大於1,和小於等於100。S和P是兩個數學家,S知道兩者的和X+Y,P知道兩者的積X*Y,兩個人的邏輯都非常好,兩個人都知道上述的資訊,之後的對話如下:
  • S說:「P不知道X和Y的值。」
  • P說:「現在我知道X和Y的值。」
  • S說:「現在也我知道X和Y的值。」
X和Y分別是多少?
代码实现:
[Java] 纯文本查看 复制代码
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[2];

	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[0] = x;
					arr[1] = y;
				}
			}
			// 用hs3记录hs1中的数分解为积的所有解,仅有一条满足条件2的p值的集合
			if (m == 1) {
				hs3.add(s);
				System.out.println("x的为:" + arr[0] +"---- "+"y的值为:" + arr[1]);
			}
		}

		// 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;
	}
}


欢迎大神提供更好的方法

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
czqfjczq + 1 + 1 热心回复!
cbjboss333 + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

0231121 发表于 2017-3-14 15:12
头好痛。 好像差不多是这样的
wenen 发表于 2017-3-14 17:02
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一个月,记住不少英文单词.....
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-27 01:12

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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