[练习]快速算出1到100万之间的素数

import java.util.Scanner;
public class PrimeNum {
	public static void main(String[] args) {
		Scanner AAA = new Scanner(System.in);
		int maxNum = AAA.nextInt();//输入最大范围
		long start = System.currentTimeMillis();
		int count = 0;//计数器
		label1:
		for(int i=2;i<=maxNum;i++) {
			if(i%(Math.sqrt(i))==0) {
				//当这个数为任何数的次方时判断为非质数 如8281 是91*91
				continue label1;
			}
			for(int j=2;j<=i;j++) {
					if(i%j==0) {
						if(i==j) {
							System.out.print(i+"\t");//输出质数
							count++;
							if(count==10) {//计数器为10时换行并重置计数器
								System.out.println();
								count=0;
							}
							continue label1;
						}else {
							continue label1;//如不是质数则直接跳过下面的判断语句
						}
					}else {
						/*
						 * 当上面的判断无法快速得出结论时 如29
						 * 迭代因子必须叠加到29时才能判断其是否为质数
						 * 但是当迭代因子大于它的一半时就可得出结论
						 * 因为迭代因子再往上叠加不可能被这个数除尽
						 * 所以当迭代因子大于这个数的一半时可以直接判断其为质数
						 */
						if(j>(i/2)) {
							System.out.print(i+"\t");
							count++;
							if(count==10) {
								System.out.println();
								count=0;
							}
							continue label1;
						}
						/*
						 * 同理 当数字大于1w或者10w时可以通过迭代因子是否大于1000来判断是否还能被整除
						 * 因为1000*1000=100w
						 */
						if(j>Math.sqrt(maxNum)) {
							System.out.print(i+"\t");
							count++;
							if(count==10) {
								System.out.println();
								count=0;
							}
							continue label1;
						}
					}
				}
		}
		long end = System.currentTimeMillis();
		System.out.println();
		System.out.print("耗时"+(end-start)+"ms");//耗时663ms
	}
}

猜你喜欢

转载自blog.csdn.net/africanhusky/article/details/81086507