m0_59481954 2021-10-15 23:20 采纳率: 100%
浏览 20
已结题

关于力扣“计算质数”这一题的一些疑问

是这样的,这题我试着用“线性筛”的方法进行求解,在解题的过程中发现了这样一个问题,令我很困惑,首先一个代码如下


```java
class Solution {
    public int countPrimes(int n) {
        //存放质数的集合
        int[] primes = new int[n+1];

        int num = 0;

        //标记是否为质数
        boolean[] bp = new boolean[n+1];

        for (int i = 2; i < n; i++) {
            if (!bp[i]){
                primes[num++] = i;
            }

            for(int j = 0;j < num ;j++){
                if( i * primes[j] < n){
                    bp[i*primes[j]] = true;
                }
                
                //  **关键点在这里**
                if (i % primes[j] == 0) {
                    break;
                }
            }
        }

        return num;

    }
}


img


可以看到,在这里int类型的运算超出表示范围了,所以报错了,但是,如果换一种写法,如下:

class Solution {
    public int countPrimes(int n) {
        //存放质数的集合
        int[] primes = new int[n+1];

        int num = 0;

        //标记是否为质数
        boolean[] bp = new boolean[n+1];

        for (int i = 2; i < n; i++) {
            if (!bp[i]){
                primes[num++] = i;
            }

            for(int j = 0;j < num && i * primes[j] < n;j++){
                bp[i*primes[j]] = true;
                if (i % primes[j] == 0) {
                    break;
                }
            }
        }

        return num;

    }
}

也就是把判断放到for循环的判断语句里了,结果如下:

img

所以说判断语句放在for循环的循环体里和放在for循环的判断语句里是有所不同的吗?
到底有什么不同呢?希望有人能帮我答疑解惑

  • 写回答

1条回答 默认 最新

  • 想上天的狗 2021-10-15 23:25
    关注

    你放循环体里万一超出范围还会赋值,最后只能报错。而放判断语句里它会先判断是否会超出范围,一旦超出它就退出,也就不会执行赋值

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月23日
  • 已采纳回答 10月15日
  • 创建了问题 10月15日

悬赏问题

  • ¥188 寻找能做王者评分提取的
  • ¥15 matlab用simulink求解一个二阶微分方程,要求截图
  • ¥30 乘子法解约束最优化问题的matlab代码文件,最好有matlab代码文件
  • ¥15 写论文,需要数据支撑
  • ¥15 identifier of an instance of 类 was altered from xx to xx错误
  • ¥100 反编译微信小游戏求指导
  • ¥15 docker模式webrtc-streamer 无法播放公网rtsp
  • ¥15 学不会递归,理解不了汉诺塔参数变化
  • ¥15 基于图神经网络的COVID-19药物筛选研究
  • ¥30 软件自定义无线电该怎样使用