求素数(质数)的方法(求100以内的素数及判断该数是否为素数)

 “素数,也是质数是指在大于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);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值