大家好,小问来为大家解答以上问题。java小程序项目,java小程序这个很多人还不知道,现在让我们一起来看看吧!
1、假设:和为s,积为p,两个整数为a和b,其中s=a+b, p=a*b,称其为一对第1步:我不知道这两个整数是多少,但我肯定你也不知道。
2、这说明:我不知道:s至少是两对整数的和,如果仅有一对的话,即a+b=s,那么“我”就知道这两个数是什么了,如5。
3、我肯定你也不知道:对于所有相加等于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步结果之“我现在知道”说明对于乘积为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。
以上就是【java小程序项目,java小程序】相关内容。