题目二: 判断 m-n 之间(其中m<n且m>0)有多少个素数,并输出所有素数
1.核心代码
for (int i = m; i <=n; i++) {
//素数判定方法为除了1和本身外,不能被其他数整除
//很显然数的一半以上的数字是不可能符合除数条件的,
//因而可以缩减内层循环范围
for (int j = 2; j <=i/2+1; j++) {
if(i==2){
flag01=true;
break;
}
if(i%j==0){
break;
}
if(j==i/2+1){
flag01=true;
}
}
if(flag01){
System.out.print("\n第"+(++count)+"个素数的值为:"+i);
}
flag01=false;
//重新开始要保证flag01为false值(与默认保持一致)
}
2.常见问题点分析
2.1 素数的判定依据是什么???
素数的判定条件为: 大于1的自然数;除了1和自身外没有其他的除数(两者缺一不可)
2.2 内层循环中j<=i/2+1的作用是什么???
解答:素数的判定依据意味着我们必须从2开始,一个个拿着数去相除
按理来说是要除到倒数第二个数字的,这样内层循环范围很大
但是可以缩小范围
a.当i=3时,3%2=0------->需要除1次,除数是丛2开始
没有等号的话显然就不能执行判断素数这个for循环
因而等号是必须要的
b.一般来说,除数只要取到被除数的一半就行了
后面的数字执行去模操作就毫无意义了
例如数字6,一半是3,而6%4!=0,6%5!=0
这很显然后面必然不是其除数
2.3 布尔类型变量flag01的作用是什么?
解答如下:
核心:确保素数能被顺利打印.默认值为false
当i不满足素数条件时,flag01值是不变的,此时无需打印
当i满足素数条件时,flag01值改为true,打印对应的素数值
注意:每次打印完素数后,flag01的值就要变为默认值false
确保素数都是被正常打印的
2.4 布尔类型变量flag02的作用是什么?
解答如下:
默认值为true
核心:确保输入的m、n两个值是符合条件的,
如果不符合条件就提示再次输入(直到输入正确时,程序才会结束)
具体来说:
当输入的值m、n值符合条件时,flag02=true,
执行break语句跳出while(true)循环
当输入的值m、n值不符合条件时,flag02=flase
执行scanner.nextInt语句,确保重新输入m与n的值
2.5 有多少种不符合条件的m.n值?
解答:有三种,具体如下所示:
第一种 m<0
第二种 n<0
第三种 m>n
2.6 数字2是素数吗?如何判定??
解答如下:
2是素数,因为大于自然数1且除数只有1和它本身
判定条件:当i=2时,直接flag01=true
然后break跳出循环(判定素数的条件的初始值都是从2开始的)
3.运行截图
3.1 第一次输入m<0且第二次输入正确
3.2 第一次输入n<0且第二次输入正确
3.3 第一次输入时m>n且第二次输入正确
3.4 第一次输入正确
4.源代码
import java.util.Scanner;
public class FindPrimeNumber {
public static void main(String[] args) {
System.out.println("题目二: 判断 m-n 之间(其中m<n且m>0" +
")有多少个素数,并输出所有素数。");
Scanner scanner=new Scanner(System.in);
System.out.println("请输入m的值");
int m=scanner.nextInt();
System.out.println("请输入n的值");
int n=scanner.nextInt();
boolean flag01=false;
//标记是否为素数,是素数值为true,不是值就为false,默认为false
boolean flag02=true;
//用来标记是否跳出循环
int count=0;
//定义count来进行素数个数的统计
while(true){
if(m>0&&m<n){
flag02=true;
for (int i = m; i <=n; i++) {
//素数判定方法为除了1和本身外,不能被其他数整除
//很显然数的一半以上的数字是不可能符合除数条件的,
//因而可以缩减内层循环范围
for (int j = 2; j <=i/2+1; j++) {
if(i==2){
flag01=true;
break;
}
if(i%j==0){
break;
}
if(j==i/2+1){
flag01=true;
}
}
if(flag01){
System.out.print("\n第"+(++count)+"个素数的值为:"+i);
}
flag01=false;
//重新开始要保证flag01为false值(与默认保持一致)
}
}else {
flag02=false;
System.out.println("输入的m或者n值有误,请检查后重新输入");
System.out.println("请再次输入m的值");
m=scanner.nextInt();
System.out.println("请再次输入n的值");
n=scanner.nextInt();
}
//如果m与n的值输入无误
// 得出素数结果后就会跳出while循环,从而结束程序
if(flag02){
System.out.println("\n"+m+"到"+n+"的范围内的素数的总个数为:"+count);
break;
}
}
}
}