java素数查找—大范围(10^6以内)全输出

天天向上

import java.util.Scanner;
public class Prime{
	static int []arr=new int[1000001];//标志数组
	static int []prime=new int[1000001];
	public static void main(String[] args) 
	{
		Scanner In=new Scanner(System.in);
		int n=In.nextInt();//n<10^5;
		int i,j=2;
		boolean flag=false;
		prime[0]=2;
		prime[1]=3;
		for(i=5;i<=n;i+=2){
			if(arr[i]==0){//说明不是倍数,1的话是倍数的标志
				flag=isprime(i);
			}
			if(flag){
				prime[j++]=i;
			}
			else{
				for(int k=1;i*k<=n;k++){
					arr[k*i]=1;
				}
			}
			flag=false;//此步必须要写,为了防止前面多个if并列都走出现的arr[i]==1(是非质数倍数不需要判断),而继续走下面的if出现falg=true直接存入的情况
		}
		print(prime);
	}

	public static boolean isprime(int x){
		int i;
		int k=(int)Math.sqrt(x);
		for(i=2;i<=k;i++){
			if(x%i==0){
				return false;
			}
		}
		if(i==k+1){
			return true;
		}
		return false;
	}

	public static void print(int []prime){
		for(int i=0;i<prime.length;i++){
			if(prime[i]!=0){
			System.out.printf("%-7d",prime[i]);
			if(i+1==prime.length||prime[i+1]==0){  //简化循环便利,当前输出完后,判断下一个是否为0,是直接跳出(按顺序),防止越界加上了前面一句话
				break;
			}
			}
			if((i+1)%10==0){//10行换行
				System.out.println();
			}
		}
	}
}
posted @ 2019-11-28 17:32  东辰弈  阅读(404)  评论(0)    收藏  举报