问题:判断
101-200之间有多少个素数,并输出所有素数。
程序分析:
素数:如果一个数只能被1和自己整除,那么这个数就是素数
判断素数的方法:用一个数分别去除
2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。
上面有这么一句话:用一个数分别去除2到sqrt(这个数) 为什么除到这个数的开平方就好了呢?假如我判断16是不是素数(16的平方根是4),步骤是这样的:
用16去除2 能整除
用16去除3 不能整除
用16去除4 能整除
(已经除到4啦)
为啥可以不用继续了呢?
你用16去除以8 结果是2 而一开始你已经用16除了2 相当于做了重复的操作 以我的理解 除到平方根的位置 就相当于找到了一个对称位置 超过这个位置的操作就是重复的
程序设计:
这个题中,用双层循环,外循环表示101到200之间的每一个数, 在外层循环设置一个变量用来计数,一个变量用来标记是否是素数,
内循环表示2到这个数的开平方数;首先在内存循环中判断当前这个数能否被2到sqrt(这个数)整除,只有能满足一个 就将标记变为true 并且跳出当前这个循环;然后在外层循环中检查flag的变化 如果flag是false,就表示这个数是素数 就需要将计数器加上一,并且每次在外层循环都需要将flag重置为false
(如果不重置的话,假如某一次flag变为了true 之后就一直为true了 就意味着之后每一个数都不是素数了....所以就需要重置)
代码:
import org.junit.Test;
public class IsPrime {
/**
* 统计某个区间素数的方法
* @param number1(数字1)
* @param number2(数字2)
* @return int 素数的个数
*/
public static void isPrime(int number1 , int number2) {
//用来计数的变量
int total = 0;
//用来判断是否是素数的标记
boolean flag = false;
//外层循环表示遍历两个数之间的所有数
for(int i = number1 ; i <= number2 ; i++) {
//内层循环表示遍历从2到这个数的开平方数
for(int j = 2 ; j <= Math.sqrt(i) ; j++) {
//如果能整除 就将标记设置为true 并且跳出本次循环
if(i % j == 0) {
flag = true;
break;
}
}
//当标记还是没变化(仍然是false)时 就代表这个数是素数
if(!flag) {
total ++;
System.out.println(i+"是素数");
}
//每次计算完一个数都将标记重置为false
flag = false;
}
System.out.println(number1+"和"+number2+"之间的素数个数是"+total);
}
/**
* 测试
*/
@Test
public void test() {
isPrime(101 , 200);
}
}