码迷,mamicode.com
首页 > 编程语言 > 详细

求素质的算法

时间:2016-02-22 12:11:57      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:

根据素数的性质:只能被1和它本身整除,不过如果直接编写循环与自身除,时间复杂度很高,不好。

利用其它的一些性质可以修改算法,比如偶数肯定不是素数(除了2)。

定理: 如果n不是素数, 则n有满足1<d<=sqrt(n)的一个"素数"因子d。

所以有如下程序:

bool isPrime(long n)
{
    if (n <= 1)
        return false;
    if (n == 2 || n == 3)
        return true;
    for (int i = 3; i*i <= n; i+=2)//sqrt(n)效率较低
    {
        if (n%i == 0)
            return false;
    }
    return true;
}

对于每个n,只判断3,5,7……等基数因数,并且只判断到<=sqrt(n)。

时间复杂度变为O(sqrt(n))。

 

再补个斐波那契数列的程序,很简单:

void Fibonacci()
{
    long i1 = 0;
    long i2 = 1;
    long i3;
    cout << i1 << endl;
    cout << i2 << endl;
    while (true)
    {
        i3 = i1 + i2;
        i1 = i2;
        i2 = i3;
        cout << i3 << endl;
        if (i3 >= INT_MAX/2)
        {
            break;
        }
    }
}

其实根据计算机的long long最大就64位。所以直接查表是时间复杂度最低的方法。

static const int Fibonacci[] = 
{
    0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,
    2584,4181,6765,10946,17711,28657,46368,75025,121393,196418,
    317811,514229,832040,1346269,2178309,3524578,5702887,9227465,
    14930352,24157817,39088169,63245986,102334155,165580141,267914296,
    433494437,701408733,1134903170,1836311903,-1323752223
};

 

求素质的算法

标签:

原文地址:http://www.cnblogs.com/wyc199288/p/5206589.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!