关于一道判断素数题目的思考
这两天在学习程序设计这门课程,上课的时候也会做一些编程的题目,以为之前一直在学习编程的知识,所以感觉这些题目都很简单。但是在做其中的一道判断一个数是不是素数的时候,被最后一个数据给卡到了,看了测试样例发现给的那个数字是整型的最大数字,然后我就开始向素数打表的方向上去考虑用空间来换取时间,但是因为所给的数字太大了,数组不能够开那么大的空间,然后去看了别人的代码,学到了一种比较高效的判断素数的方法。
我们都知道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;来进行判断的话,输出的结果会有误。
永远渴望,大智若愚(stay hungry, stay foolish)