以下只是简单的质数求法,另外想提高效率可以尝试过滤的方法。
/**功能:查找100以内的所有质数。 答案:2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
* 概念:1既不是质数也不是合数,质数只能够被1和它本身整除,
* 算法:2是最小的质数,因此判断一个数i是不是质数,可以将该数除以j(2<=j<i等).如果i不能被j整除,则i是质数;否则i不是质数。
* 另外除2以外的偶数都不是质数,因为2是这些偶数的质因数。设n=a*b,若a>=sqrt(n),则b<=sqrt(n),即任意合数n可以转换为两个因数的乘积,
* 其中一个数大于等于sqrt(n),另一个小于等于sqrt(n)。
* 此算法中至少应有2个循环,一个用来实现i从1到100的计数,另一个用来实现除数j的计数。我们用一个标记flag来反应i能否被j整除(flag=i%j)。
*/
package project1;
public class PrimeNumber {
public static void main(String[] args) {
int i,j,flag=1;
//算法1:(2<=j<i)
for(i=2;i<=100;i++){ //1不是质数,从2遍历到100
for(j=2;j<i;j++){ //加上限制条件,让i=3开始才能执行第2个循环,i=2时直接输出
flag=i%j;
if(flag==0) //一旦发被j整除,退出内循环,转到外循环
break;
}
if(flag!=0) //i不能被j整除,输出i
System.out.print(i+" ");
}
//算法2:(2<=j<=i/2)
System.out.println();
flag=1;
for(i=2;i<=100;i++){ //1不是质数,从2遍历到100
for(j=2;j<=i/2;j++){ //加上限制条件,让i=3开始才能执行第2个循环,i=2时直接输出
flag=i%j;
if(flag==0) //一旦发被j整除,退出内循环,转到外循环
break;
}
if(flag!=0) //i不能被j整除,输出i
System.out.print(i+" ");
}
//算法3:(2<=j<=Math.sqrt(i))
System.out.println();
flag=1;
for(i=2;i<=100;i++){ //1不是质数,从2遍历到100
for(j=2;j<=Math.sqrt(i);j++){ //加上限制条件,让i=3开始才能执行第2个循环,i=2时直接输出
flag=i%j;
if(flag==0) //一旦发被j整除,退出内循环,转到外循环
break;
}
if(flag!=0) //i不能被j整除,输出i
System.out.print(i+" ");
}
//算法4:(排除2以外的偶数,且2<=j<=Math.sqrt(i))
System.out.println();
flag=1;
System.out.print(2+" "); //先将2输出
for(i=3;i<=100;i+=2){ //除2以外的偶数都不是质数,设计步长为2,只查找奇数
for(j=2;j<=Math.sqrt(i);j++){ //加上限制条件,让i=3开始才能执行第2个循环,i=2时直接输出
flag=i%j;
if(flag==0) //一旦发被j整除,退出内循环,转到外循环
break;
}
if(flag!=0) //i不能被j整除,输出i
System.out.print(i+" ");
}
}
}