第二个练习,看着简单,但是自己写出来漏洞百出,发现自己算法部分真的太过欠缺,以后还得接着练。
一、问题描述
题目:判断101-200之间有多少个素数,并输出所有素数。
程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。
二、问题分析
质数(prime number)又称素数,有无限个。
质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。
自然数是指表示物体个数的数,即由0开始,0,1,2, 3,4,……一个接一个,组成一个无穷的集体,即指非负整数。
一开始想到的很浅显,只是看到了求素数有多少个。
三、代码实现
public class MainTest {
public static void main(String[] args) {
int primeNum = 1;//信号量,标记该数是否为素数,默认为“是“
int n = 0;//素数个数的计数
//遍历101——200
for(int num = 101; num<=199;num++){
//遍历除数
for(int divisor = 2; divisor<num; divisor++){
if(num%divisor==0){
primeNum = 0;
}
}
if(primeNum==1){
n++;
}
primeNum = 1;//再次初始化primeNum
}
System.out.println("素数的个数为" + n);
}
}
以上为错误演示_(:з)∠)_,错误地方有:
- 没有看清题目,判断101-200之间有多少个素数,并输出所有素数。求的是a与b之间的范围,这个范围我认为的是包括a与b,但是在网上搜索大部分倾向于不包括...而且和后面答案也不一样,这里不做纠结了;输出不符合规则,大错误。
- 存在可优化部分,判断素数可以单独用一个方法,可以省去每次清零,除数可以从2到平方根。
三、案例答案
public static void main(String[] args){
int m = 1;
int n = 1000;
int count = 0;
//统计素数个数
for(int i=m;i<n;i++){
if(isPrime(i)){
count++;
System.out.print(i+" ");
if(count%10==0){
System.out.println();
}
}
}
System.out.println();
System.out.println("在"+m+"和"+n+"之间共有"+count+"个素数");
}
//判断素数
private static boolean isPrime(int n){
boolean flag = true;
if(n==1)
flag = false;
else{
for(int i=2;i<=Math.sqrt(n);i++){
if((n%i)==0 || n==1){
flag = false;
break;
}
else
flag = true;
}
}
return flag;
}
这里这的学习的地方有:
- 将判断素数单独用方法判断,使主函数精简,条理清楚。
- 只需修改m、n的值就可以改变判定范围,对修改程序看效果十分友好。
- 输出美观,有文字解释,有格式上的优化,如输出十个数字就换行,对展示的用户十分友好。
- 优化合理,除数只除到了平方根,例如36,它的因子为:1,2,3,4,6,9,12,18,36,由平方根呈对称分布,所以除到平方根就可以不往下除了。
存在的疑问有:
- if ((n % i) == 0 || n == 1)这行代码对n的判断是否是多余了,因为之前的if语句里出现了n是否为1的判断,我目前认为是的。