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 + " ");
}
}

浙公网安备 33010602011771号