关于素数已经是老生常谈,但对于新手的我来说就是新的体验,可能所写不及大牛的十万分之一
素数(质数):除了1和它本身以外不再有其他因数,这样的数称为素数。
先来素数的判断:(时间复杂度是O(√N),书中说这个是最坏的... )
//判断一个数是否是素数
void primeNumber(int n)
{
if (n <= 1)
{
cout << "no" << endl;
return;
}
else if (n == 2 || n == 3)
{
cout << "yes" << endl;
return;
}
else
for (int i = 2; i <= pow(n, 0.5); ++i)
if (n%i == 0) {
cout << "no" << endl;
return;
}
cout << "yes" << endl;
}
书中提到一个点: B为N的二进制表示法中的位数,那么我们知道O(√N)=O(2^(B/2)),如此表示,当面对比较一个20(二进制)位的数是否是素数和一个40(二进制)位的数是否是素数的运行时间,发现用B更好比较。
后书中让实现厄拉多塞筛:
计算小于N的所有素数的方法:从2~N,找出最小的未被删除的整数i,输出i,然后删除i,2i,3i,... ci( ci<N )
一图胜千言:
时间复杂度为O(NloglogN) ,别问我怎么算的,我也不知道,貌似有:(N/2+N/3+N/5+...)=N(1/2+1/3+1/5+...)=O(NloglogN)
代码如下:
//厄拉多塞数
//O(NloglogN)
int main()
{
int n;
cout << "请输入n:" << endl;
cin >> n;
bool* a = new bool[n];
memset(a, true, n);
for (int i = 2; i < n; ++i)
{
if (a[i] == true)
cout << i << " ";
int j = i;
while (j <= n) {
a[j] = false;
j += i;
}
}
cout << endl;
system("pause");
return 0;
}