全素组
题目
:如果不大于指定整数n的3个素数之和仍为素数,则把这3个素数称为一个基于n的全素组。例如对于n=15,素数3,5,11之和3+5+11=17为素数,则3,5,11
称为一个基于15的全素组。定义所有基于n的全素组中和最大的全素组称为最大全素组。 输入整数n(n≤3000),输出基于n的全素组的个数,并输出一个最大全素组。
1.思路:
枚举法,一个判断是否为质数的方法,一个获取不大于某数的所有质素的集合(此处用了ArrayList集合才做出来,本来想自己定义一个数组,初始化为Null,后面再给出具体大小,但是发现这样会报空指针异常,也throw不了。),一个具体处理方法(输出最大全素组和所有个数)
2.注意点:
a.忘了1既不是质数也不是合数,导致改错改了半天。
b.ArrayList里的get方法需要强制类型转换。
3.运行效率:
低,时间长。
4. 下面展示一些 内联代码片
。
import java.util.ArrayList;
import java.util.Scanner;
public class T1_1_28 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();
sc.close();
long start = System.currentTimeMillis();
primeNumber(m);
long end = System.currentTimeMillis();
System.out.println(end - start+"ms");
}
public static void primeNumber(int a) {
ArrayList<Integer> arr = recordNum(a);
int sum = 0;
int tem = 0;//记录有几组全素组
int max1 = 0;//全素组三个数最大值
int max2 = 0;
int max3 = 0;
for(int i = 0; i<arr.size(); ++i) {
for(int j = i+1; j<arr.size(); ++j) {
for(int k = j+1; k<arr.size(); ++k) {
sum = (int) arr.get(i) + (int) arr.get(j) + (int) arr.get(k);
if(isPrime(sum)) {
tem++;
max1 = (int) arr.get(i);
max2 = (int) arr.get(j);
max3 = (int) arr.get(k);
}
}
}
}
if(tem == 0) {
System.out.println("没有全素组");
} else {
System.out.println("全素组有"+tem+"个,"+"最大全素组为:"+max1+","+max2+","+max3);
}
}
//返回不大于val的所有质数
public static ArrayList<Integer> recordNum (int val) {
int sum = 0;
ArrayList<Integer> a = new ArrayList<Integer>();
for(int i = 1; i <= val; ++i) {
if(isPrime(i)) {
a.add(i);
sum++;
}
}
return a;
}
//判断是否为质数
public static boolean isPrime(int b) {
if(b == 1) {
return false;
}
if(b == 2) {
return true;
}
for(int i = 2; i<b; ++i) {
if(b % i == 0) {
return false;
}
}
return true;
}
}
5.学习心得:目前处于菜鸡阶段,自己写一个要想很久很久,稍微难一点就得看别人的方法。坚持吧