Java小程序(java小程序)

导读 你们好,我是九旅网的小编小九,Java小程序,java小程序很多人还不知道,现在让我们一起来看看吧!1、假设:和为s,积为p,两个整数为a和b...

你们好,我是九旅网的小编小九,Java小程序,java小程序很多人还不知道,现在让我们一起来看看吧!

1、假设:和为s,积为p,两个整数为a和b,其中s=a+b, p=a*b,称其为一对 第1步:我不知道这两个整数是多少,但我肯定你也不知道。

2、 这说明: 我不知道:s至少是两对整数的和,如果仅有一对的话,即a+b=s,那么“我”就知道这两个数是什么了,如5。

3、 2、我肯定你也不知道:对于所有相加等于s的两个整数,他们的乘积p,至少有两对整数的乘积与p相等,同上,如果只有一对整数的乘积等于p,那么“你”就肯定知道这两个数了。

4、 换句话说,这两个数不能都是质数 对于和为s的所有整数对,都要满足2,这就是“我肯定”的意思,因为只要有一对全部都是质数的话,“我”就不能“肯定”了。

5、 所以,找到和为s,积为p,但不同时为质数的所有整数对 结果:和为11,17,23,27,29,35,37,41,47,51,53的整数满足条件 第2步:我本来不知道这两个数是多少。

6、但既然你这么说,那我现在知道了。

7、 这说明: 对于乘积为p的所有整数对,至少有一对他们的和是第1步结果之一 2、“我现在知道”说明对于乘积为p的整数对中,只有一对的和是第1步结果之一,如果不止一对的话,“我”还是不能确定。

8、 所以:对于第1步结果中所有可能的整数对,相乘得到p,再统计所有乘积为p的整数对的和在第1步结果中出现的次数,出现次数为1的即为结果。

9、 结果:整数对为4,13,他们和是s=17,他们的乘积为p=52 只回答第三题 import java.util.*; public class FindOut { static int MIN = 2; static int MAX = 99; static boolean[] available = new boolean[(MAX+MIN+1) * 2]; public static void main(String[] args) { loop1:for (int s=MIN*2; s<=MAX*2; s++) { available[s] = false; Vectorv = getAddFactors(s); int len = v.size(); if (len < 2) { continue loop1; } for (int i=0; i v = getAddFactors(s); int index = indexOfAvailableSum(v); if (0 <= index) { IntPair ip = v.get(index); System.out.println("Result is: " + ip.l + "," + ip.r + " and sum=" + s + ", product=" + ip.l*ip.r); } } } } static Vector getAddFactors(int sum) { Vector v = new Vector(); int max = Math.min((int)((sum+1)/2), MAX); for (int i=MIN; i<=max; i++) { int j = sum - i; if ((i <= j) && (j<=MAX)) { v.add(new IntPair(i, j)); } } return v; } static boolean isPrimePair(IntPair ip) { for (int i=2; (i*i)<=ip.l; i++) { if (ip.l % i == 0) { if ( (ip.r*i)<=MAX ) { return false; } } } for (int i=2; (i*i)<=ip.r; i++) { if (ip.r % i == 0) { if ( (ip.l*i)<=MAX ) { return false; } } } return true; } static int indexOfAvailableSum(Vector v) { int result = -1; int len = v.size(); int[] count = new int[len]; for (int i=0; i。

本文到此讲解完毕了,希望对大家有帮助。