质数:
- 又称素数,只能被1和它本身整除的数就是质数。
难点:
- 需要两层循环,外层循环99遍;
- 内层循环,控制除数为2到98(也就是2到被除数前面的一个数)。
- 为什么从2开始?因为所有数都能被1整除。
- 需要定义一个变量flag来记录某个数是不是质数
- 内层循环结束后需要重新把flag重置为true
方法一:
import org.junit.Test; public class Demo { @Test public void primeNumberTest() { boolean flag = true; for (int i = 2; i <= 100; i++) { for (int j = 2; j < i; j++) { if (i % j == 0) { //为什么要定义变量flag? //因为只能被1和它本身整除的才是质数,而如果if的判断条件为true //则这个数不是质数。因为进入if判断条件,意味着这个数能被2到i-1的某个数整除 flag = false; } } if (flag) { System.out.print(i+","); } //因为内层循环会把flag的值设置为false //如果没有下面的语句,flag的值在进入内层循环之后将永远为false flag = true; } } }
结果:
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,
方法二:
与方法一相比有所改进的地方,把flag放在外层与内层循环之间,这样就不用每次结束内层循环后去重置flag的值。
import org.junit.Test; public class Demo { @Test public void primeNumberTest() { for (int i = 2; i <= 100; i++) { //因为flag定义在外层循环与内层循环之间,所以每次开始外层循环时flag的值都是true //这样就不需要在内层循环结束时重置flag的值为true了 boolean flag = true; for (int j = 2; j < i; j++) { if (i % j == 0) { //为什么要定义变量flag? //因为只能被1和它本身整除的才是质数,而如果if的判断条件为true //则这个数不是质数。因为进入if判断条件,意味着这个数能被2到i-1的某个数整除 flag = false; } } if (flag) { System.out.print(i + ","); } } } }
结果
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,
方法三:
改进:在if判断语句后面加了break,因为只要有能被2到i-1当中的一个数整除,这个i就不是质数,就没有必要继续循环下去
import org.junit.Test; public class Demo { @Test public void primeNumberTest() { System.out.println(start); for (int i = 2; i <= 10000; i++) { boolean flag = true; for (int j = 2; j <i; j++) { if (i % j == 0) { flag = false; break;//这是改进的地方,因为只要有能被2到i-1当中的一个数整除,这个i就不是质数,就没有必要继续循环下去 } } if (flag) { System.out.print(i+","); } } } }
方法四:
改进:把j的取值范围由<i,改为<=Math.sqrt(i)
import org.junit.Test; public class Demo { @Test public void primeNumberTest() { for (int i = 2; i <= 100; i++) { boolean flag = true; for (int j = 2; j <= Math.sqrt(i); j++) { if (i % j == 0) { flag = false; break; } } if (flag) { System.out.print(i + ","); } } } }
方法四的小改进:
加了一个count,去统计质数的个数
import org.junit.Test; public class Demo { @Test public void primeNumberTest() { int count=0; for (int i = 2; i <= 100; i++) { boolean flag = true; for (int j = 2; j <= Math.sqrt(i); j++) { if (i % j == 0) { flag = false; break; } } if (flag) { System.out.print(i + ","); count++; } } System.out.print("质数个数为:"+count); } }
结果:
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,质数个数为:25
后记:
2020年3月3日 09:45AM 星期二 农历2020年二月初十 上海 晴 温度:12°,比较冷。