标签:
根据素数的性质:只能被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