您的位置:首页 > 其它

求素质的算法

2016-02-22 11:30 183 查看
根据素数的性质:只能被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
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: