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

  • 相关阅读:
    Java多线程(二)关于多线程的CPU密集型和IO密集型这件事
    Java 过一下基础
    日历打印用java实现
    DAY8-打卡第八天-2018-1-18
    web-day1-初识标识符
    DAY7-图形界面第一弹-2018-1-17
    四种排序方法用java实现
    DAY6-小变化(java提示框)-2018-1-16
    DAY5-小别-2018-1-15
    DAY4-打卡第四天-2018-1-12
  • 原文地址:https://www.cnblogs.com/h-hkai/p/13730918.html
Copyright © 2011-2022 走看看