题目:
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;
}
}
欢迎大神提供更好的方法 |