编写程序求出10万以内的所有素数,然后再判断这些素数中 哪些是由素数拼接而成的。例如素数23就符合条件, 23本身是素数,其由素数2,和素数3拼接(连接)组成。素数29就不满足条件,2是素数,而9不是素数。素数307不满足条件,不能忽略0. 需要把符合条件的 拼接素数全部打印出来,并统计个数。
首先我们可以定义具有100001个空间的boolean数组,当某个数为为真时,其下标对应的数就是符合条件的素数。
static boolean[] result = new boolean[100001];
根据题目的意思,可以判断出符合条件的素数必然是由2,3,5,7组成的。所以我们可以令result[2],result[3],result[5],result[7]都为真,其它的数用其默认值false。我们可以定义一个整数型counter的数,来统计符合条件的素数。
判断是不是符合条件的数,在这里分来两步。第一步来判断是不是素数。
public static boolean isPrim(int num) {
int k = (int) Math.sqrt(num);
for (int j = 2; j <= k; j++) {
if (num % j == 0) {
return false;
}
}
return true;
}
如果不是,则返回false,不需要执行第二步,直接就将该数否定掉。如果true,则执行第二步。
试想一下,如果一个数是符合题目的素数的话,将它拆成两半的话,两边的数必然还是由2,3,5,7组成的,但不一定是素数。为了计算方便,我们可以把任意一个数拆成个位和个位以前的数。我们可以通过求余和除得到这两边的数。假设int num是我们需要判断是不是符合题目的素数。
int number1 = num / 10;
int number2 = num % 10;
number1是除个位以外的数,number是个位。
如果number1为0的话,我们只需要判断number2是不是为2,3,5,7就行。这是,我们只要判断result[number2]是不是为true就行。
如果number1不为0的话,我们先判断numer2。如果number2为2,3,5,7以外的数时,num必然不是符合条件的素数(若num末尾为2时,是不会执行到这一步,随意这里的2是位于num中间的)。如果number1是2,3,5,7之间的某个数的话,在来判断number1.弱国number1已经是曾经判断过,是符合题目条件的素数了的话,即result[number1]为true,则不需要继续判断了,此时num已经就是符合条件的数了。如果result[number1]为false的话,那么number1必然不是符合条件的数,但num有可能是符合条件的素数。(因为该方法是自下而上进行的。)此时我们需要进一步判断number1是不是有2,3,5,7组成的即可。这是我们就可以递归了。
public static boolean isResult(int num)
我们传入参数素数参数进去,如果符合题目,就返回true。需要递归时我们返回
return isResult(number1);
即numer2符合条件了,接下类只要判断number1了。
最后,把整个代码发出来,仅供参考
public class SuShu {
static boolean[] result = new boolean[100001];
static int counter = 0;
public static boolean isPrim(int num) {
int k = (int) Math.sqrt(num);
for (int j = 2; j <= k; j++) {
if (num % j == 0) {
return false;
}
}
return true;
}
public static boolean isResult(int num) {
int number1 = num / 10;
int number2 = num % 10;
if (number1 == 0) {
if (result[num]) {
return true;
}
} else {
if (!result[number2]) {
return false;
} else {
if (result[number1]) {
return true;
} else {
return isResult(number1);
}
}
}
return false;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
result[2] = true;
result[3] = true;
result[5] = true;
result[7] = true;
counter += 4;
int num;
System.out.println(2);
System.out.println(3);
System.out.println(5);
System.out.println(7);
for (int i = 10; i < 100000; i++) {
num = i;
if (isPrim(num)) {
if (isResult(num)) {
counter++;
System.out.println(num);
}
}
}
System.out.println("共有" + counter + "个");
}
}
若有疑问或上述文章有问题的,欢迎指出。