关于一道判断素数题目的思考

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

  我们都知道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;来进行判断的话,输出的结果会有误。

 

posted @ 2020-09-25 16:18  Veritas_des_Liberty  阅读(235)  评论(0编辑  收藏  举报