Target:输入一个正整数n,输出1~n的所有素数
让我们再来回顾一下求素数的算法,关于素数的算法是信息学竞赛和程序设计竞赛中常考的数论知识,希望通过此次对算法思路的整理能对大家有所帮助。
1.首先是判断一个数是不是素数的最原始的方案:O(n*n)
#include<stdio.h>
#include<stdbool.h>
#include<math.h>
bool judge(int n)
{
int i;
for(i=2;i<n;i++)
if(n%i==0)
{
return false;
break;
}
return true;
}
聪明一点的同学可能会想到给n开平方来降低时间复杂度至O(n*sqrt(n))即:
#include<stdio.h>
#include<stdbool.h>
#include<math.h>
bool judge(int n)
{
int i;
for(i=2;i<=sqrt(n);i++)
if(n%i==0)
{
return false;
break;
}
return true;
}
这里给不懂的同学提示一下原理:
简单解释一下:因数都是成对出现的。比如,100的因数有:1和100、2和50、4和25、5和20、10和10。即成对的因数,其中一个必然小于等于100的开平方,另一个大于等于100的开平方。因此只要判断2~sqrt(n)的因数即可。
2.筛法的引入