回复 3楼 邓士林
我的天,做这题做了两个整整2小时...................................................
程序代码:
package cn.jxy.zzu;
public class Test {
public static void main(String[] args) {
int[] n=new int[100];//第2步所得数组
int len=TrueArray(n);//第2步所得数组以及长度
getTheOnlyNum(n,len);
}
//和先生:我知道你不知道这两个数是什么,我也不知道这两个数是什么:------>说明了该和不能为两个素数相加,两个素数相乘乘积唯一
//第1步.判断是否为素数
static boolean specialNum(int num){
int i=2;
for(;i<num;i++)
{
if(num%i==0) return true;
}
return false;
}
//第2步.把到198的数全列举出来(符合1所提标准的,放入数组中)
static int TrueArray(int n[])
{
int num=2,temp,j,k=0;//从2开始循环
for(;num<=198;num++){
temp=num/2;
for(j=2;j<=temp;j++)
{
if(specialNum(j)==false && specialNum(num-j)==false) break;//如果是素数,直接跳数判断下一个数
}
if(j==(temp+1)) n[k++]=num;//将数放入数组中
}
return k;//返回数组的长度
}
/*积先生:我现在知道这两个数是什么了:----->说明了这个数的乘积有多种组合相乘得到,同时这么多种组合中只有一个数满足第二步所提要求:例如
和为11:第一例(9+2-->9*2=18(同时3*6也为18,这时得判断3+6=9是否为在第2步所求数组中,若是,两者重复,积先生就无法得出结论))
*/
static boolean isTheNum(int num,int n[],int currentNum)
{
int i;
for(int j=2;j*j<=num;j++){
if(num%j==0&&j!=currentNum){
for( i=0;n[i]!=0;i++){
if((j+num/j)==n[i])
{
return false;
}
}
}
}
return true;//只有当全部遍历完才确定此数满足要求
}
//和先生说他也知道了 ,说明了该和为在满足一个加数满足一个和的条件下唯一
static void getTheOnlyNum(int n[],int len)
{
int temp,temp1=0,temp2=0,i=0,p=0,j=2;//temp用来记录满足条件的乘积,temp1暂时用来记录两数和,temp2记录其中较小的加数
int sum=0;//记录最后满足条件的唯一和
int adder=0;//记录最后满足条件的唯一加数
for(;i<len;i++){
int flag=0;//flag用来标记是否为和与满足条件的加数唯一对应
for(j=2;j<=n[i]/2;j++){
temp=j*(n[i]-j);
if(isTheNum(temp,n,j))
{
temp1=n[i];
temp2=j;
flag++;
System.out.println(n[i]+" : "+j);//输出满足条件的全部加数
}
}
//记录唯一正确答案
if(flag==1)
{
sum=temp1;
adder=temp2;
}
}
System.out.println("此为正确答案:"+(sum-adder)+":"+adder);
}
}









楼上卖萌小分队
