package tengxun;
import java.util.*;
public class TestTengXun {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int number = input.nextInt();
int[] zhishu = getPrime(number);
int total = 0;
List<String> resList = new ArrayList<String>();
for (int i = 0; i < zhishu.length; i++) {
for (int j = i; j < zhishu.length; j++) {
if ((zhishu[i] + zhishu[j]) == number) {
resList.add("("+zhishu[i]+","+zhishu[j]+")");
total++;
}
}
}
System.out.println(resList.toString()); //输出具体的组合
System.out.println(total);
print(getPrime2(50));
printPrime(50);
}
private static void print(boolean[] isPrme){
for (int i = 1; i < isPrme.length; i++) {
if (i % 10 == 0) {
System.out.println(i+" : "+isPrme[i]);
}else{
System.out.print(i+" : "+isPrme[i]+" ");
}
}
}
/**
* 求素数(质数是除了1外的数中,除了1和和本身外其他没有能够被整除的数)
* @Description:TODO
* @param number
* @return
* @return:int[]
* @methodName:getZhiShu
*/
public static int[] getPrime(int number) {
StringBuilder res = new StringBuilder();
for (int i = 2; i <= number; i++) {
if (isPrime(i)) {
res.append(i + ",");
}
}
String[] strArray = res.toString().split(",");
int[] intArray = new int[strArray.length];
for (int j = 0; j < strArray.length; j++) {
intArray[j] = Integer.parseInt(strArray[j]);
}
return intArray;
}
/**
* 一般的方法求质数,这里是考虑了如果在 Math.sqrt(num)之前还没确定是二维数组那么求不可能是素数了。
* @Description:TODO
* @param num
* @return
* @return:boolean
* @methodName:isPrime
*/
private static boolean isPrime(int num) {
for (int i = 2; i < Math.sqrt(num); i++) {
if ((num % i) == 0) {
return false;
}
}
return true;
}
/**
* 这里是求range以前的所有的素数
* @Description:TODO
* @param number
* @return
* @return:int[]
* @methodName:getPrime2
*/
public static boolean[] getPrime2(int range) {
boolean[] isPrme = new boolean[range+1]; //为了方便就直接将boolean型的数组与isParme个数保持一一对应
isPrme[1] = false;
Arrays.fill(isPrme,2,isPrme.length,true); //数组填充默认值
int n = (int) Math.sqrt(range);
for (int i = 2; i <= n; i++) { //这里用了一个质数的特点,一个如果一个数不是质数那么他的整数倍的数也不是质数
if (isPrme[i]) {
for (int j = i; j*i < range; j++) {
isPrme[j*i] = false;
}
}
}
return isPrme;
}
static boolean[] printPrime(int range){
boolean[] isPrime=new boolean[range+1];
isPrime[1]=false;//1不是质数
Arrays.fill(isPrime, 2,range+1,true);//全置为true(大于等于2的位置上)
int n=(int)Math.sqrt(range);//对range开根号
for(int i=2;i<=n;i++)//注意需要小于等于n
if(isPrime[i])//查看是不是已经置false过了
for(int j=i;j*i<range;j++)//将是i倍数的位置置为false
isPrime[j*i]=false;
return isPrime;//返回一个boolean数组
}
}
2016腾讯笔试编程题java实现求一个数等于两个质数的和的组合数(2016-09-11 19:00)
最新推荐文章于 2024-04-20 15:05:57 发布