zoukankan      html  css  js  c++  java
  • 关于一道判断素数题目的思考

      这两天在学习程序设计这门课程,上课的时候也会做一些编程的题目,以为之前一直在学习编程的知识,所以感觉这些题目都很简单。但是在做其中的一道判断一个数是不是素数的时候,被最后一个数据给卡到了,看了测试样例发现给的那个数字是整型的最大数字,然后我就开始向素数打表的方向上去考虑用空间来换取时间,但是因为所给的数字太大了,数组不能够开那么大的空间,然后去看了别人的代码,学到了一种比较高效的判断素数的方法。

      我们都知道0和1既不是素数也不是合数,2和3都是素数。如果我们用6 * n + x来表示所有的整数,通过观察(6 * n, 6 * n + 1, 6 * n + 2, 6 * n + 3, 6 * n +4, 6 * n + 5)我们可以发现彩色的数字都是合数,素数只可能出现在6 * n + 1 和 6 * n + 5这两个位置。所以我们可以用下面的代码来判断一个数是不是素数。

    bool isPrime(int n) {
        if (n <= 3) return n > 1;
        if (n % 6 != 1 && n % 6 != 5) return false;
        int mid = (int)sqrt(n);
        for (int i = 5; i <= mid; i += 6) {
            if (n % i == 0 || n % (i + 2) == 0) return false;
        }
        return true;
    }

      值得注意的地方是如果我们不采用sqrt来开方,而是采用i * i <= n;来进行判断的话,输出的结果会有误。

  • 相关阅读:
    Mysql之binlog日志说明及利用binlog日志恢复数据操作记录
    JS使用Cookie
    vue2 生命周期
    vue2 手记
    vue2 design 手记
    composer.json详解
    mysql查询优化
    dockerfile
    一套不错的docker lnmp
    服务器部署docker lnmp环境
  • 原文地址:https://www.cnblogs.com/h-hkai/p/13730918.html
Copyright © 2011-2022 走看看