回复 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); } }