“素数,也是质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。”
求素数的方法:
(1)从2~x-1测试是否可以整除
(2)去掉偶数之后,从3~x-1,每次加2
(3)sqrt(x),只需判断比x开方小的部分,看是否存在因数,就知道X是不是素数
(4)判断是否能被已知的且<x的素数整除
方法一:检测[2,x-1 ]是否存在被该数整除的数
- 因为非素数都可以分解成几个质因数的乘积,所以去除非素数,剩下的都是素数
判断100以内的素数,从2开始,1不是素数!
// 100以内的素数
for (int n = 2; n < 100; n++) {
boolean isprime = true;
for (int i = 2; i < n; i++) {
if (n % i == 0) {
isprime = false;
break;
}
}
if (isprime) {
System.out.print(n + " ");
} else {
System.out.println(n + "不是素数");
}
}
方法二:去掉偶数再来判断(因为偶数都是非素数 )
//去偶数的方法主要代码
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int x=in.nextInt();
boolean isprime=true;
if(x==1||x%2==0&&x!=2){
isprime=false;//去掉不为2 的偶数和1
}else{
for(int i=3;i<x;i+=2){
if(x%i==0){
isprime=false;
break;
}
}
if(isprime){
System.out.println(x+"是素数");
}else{
System.out.println(x+"不是素数");
}
}
}
方法三:对x开方,判断[2,Math.sqrt(x)]的范围内是否存在一个数能整除x
!!!!敲黑板!!!判断的范围的边界!!
// 开方的方法(在去掉偶数的基础上进行)
if (x == 1 || x % 2 == 0 && x != 2) {
isprime = false;// 去掉不为2 的偶数和1
} else {
//x=a*b;且a<x开方<b或者a=b=x开方
//只需判断比x开方小的部分,看是否存在因数,就知道X是不是素数
for (int i = 2; i <= Math.sqrt(x); i ++) {
if (x % i == 0) {
isprime = false;
break;
}
}
}
if (isprime) {
System.out.println(x + "是素数");
}
}
或者,改成下面这种,[3,Math.sqrt(x) )
过滤偶数,然后从奇数中筛选出素数
boolean isprime = true;
if (x == 1 || x % 2 == 0 && x != 2) {
isprime = false;// 去掉不为2 的偶数和1
} else {
// x=a*b;且a<x开方<b或者a=b=x开方
// 只需判断比x开方小的部分,看是否存在因数,就知道X是不是素数
for (int i = 3; i < Math.sqrt(x); i += 2) {
if (x % i == 0) {
isprime = false;
break;
}
}
}
if (isprime) {
System.out.println(x + "是素数");
}
判断是否能被已知的且<x的素数整除,从而求素数
//用已知素数来筛选
//拿已知素数去整除新数字,如果不存在可以整除新数字的素数,那么新数字也是素数,并将其加入素数列表,否则重新循环。
int primes[]=new int[50];//统计前50个素数 ArrayList
primes[0]=2;
int cnt=1;
Main_Loop:
for(int y=3;cnt<primes.length;y++){
for(int i=0;i<cnt;i++){
if(y%primes[i]==0){
continue Main_Loop;
}
}
primes[cnt++]=y;
}
System.out.println(Arrays.toString( primes));//返回指定数组内容的字符串表示形式
标记&排除法
人的思维,构造一个n以内的素数表,令x=2,将2x,3x,4x...ax<n的数标记为0 的非素数,令x为下一位没有被标记的非素数,将2x,3x,...ax<n的数标记为非素数,再将2x,3x,...ax<n 的数标记为0的非素数......直到所有的数都尝试完毕。
转换:创建一个boolean类型的数组,初始化所有元素为true(true为素数);令x=2,如果x是素数,则对于(i=2;x*i<n;i++),令prime[x * i ]=false;然后x++,若x<n,重复上述步骤,直到所有否则结束。
//改进
public class M{
public static void primeCal(int n){
boolean prime[]=new boolean[n];
Arrays.fill(prime, true);//true 为素数,将数组所有元素填为true
int x=2;
//先将x的倍数排除
while(x<n){
for(int i=2;x*i<n;i++){
prime[x*i]=false;
}
x++;
}
//剩下的则为素数
for(int i=2;i<prime.length;i++){
if(prime[i]){
System.out.print(i+" ");
}
}
}
}
public static void main(String[] args){
primeCal(100);
}