java求质数及其简单优化

0. 简单枚举

除了1和它自身外,不能被其他自然数整除的数叫做质数。简单思路为遍历,例如求1-200间的质数,如下代码:

	public static void main(String[] args){
		for(int i = 2; i <= 200; i++) //遍历从1-200间的数字
		{
			boolean flag = true;
			for(int j = 2; j < i; j++) //遍历2 - i 的数字 看i是否能被其中一个数字 j 整除
			{
				if(i % j == 0) //如果被整除 说明该数不是质数
				{
					flag = false;
					break;
				}
			}
			if(flag == true) //反之 对质数 进行打印
				System.out.print(i + " ");
		}
		
	}

对于内部的for循环j没必要从2遍历到i-1,可以减少对j的取值,这就是简单优化的基本思路。

方法1

一个数的约数的最大值为自身的一半,例如 100 的最大约数即为 50,所以 j <= i/2 只用枚举2-50的数即可。

		for(int i = 2; i <= 200; i++)
		{
			boolean flag = true;
			for(int j = 2; j <= i/2; j++) 
			{
				if(i % j == 0)
				{
					flag = false;
					break;
				}
			}
			if(flag == true)
				System.out.print(i + " ");
		}
		
	}

方法2

一个数的约数在其平方左边,那么必然存在一个约数在在开平方数的右边。例如 100 的约数为 2 4 5 {10} 20 25 50,在10的左边有三个数右边也有三个数与之对应,只用枚举2 - 10的数字即可。

	public static void main(String[] args){
		for(int i = 2; i <= 200; i++)
		{
			boolean flag = true;
			for(int j = 2; j <= Math.sqrt(i); j++) //sqrt 开平方
			{
				if(i % j == 0)
				{
					flag = false;
					break;
				}
			}
			if(flag == true)
				System.out.print(i + " ");
		}
		
	}

还可以用continue使代码更加简洁

	l:	for(int i = 2; i <= 200; i++)
		{
			for(int j = 2; j < Math.sqrt(i); j++)
			{
				if(i % j == 0) //如果i不是奇数的话 结束本次循环并开始下一次
				{
					continue l;
				}
			}
			System.out.print(i + " "); 
		}
		
	}
posted @ 2022-04-08 10:38  canyonz  阅读(332)  评论(0)    收藏  举报