判断 m-n 之间(其中m<n且m>0)有多少个素数,并输出所有素数

题目二: 判断 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;
            }
        }

    }
}

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SSS4362

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值