素数的定义:素数也即质数;在大于1的自然数中,除了1和他本身以外没有其他的因数,我们称之为素数。
问题:求出1-100之内的素数。
方法1,利用定义直接遍历
#include<stdio.h>
#include<math.h>
//思路:优化了j的范围而非(2-i)因为如果一个数不能被从2到其开方的数整除,其即为素数
//时间复杂度:nlog2n
void main()
{
int i,j,k;
for(i=1;i<=100;i++)
{
int k = sqrt(i);
for(j=2;j<=k;j++)
{
if(i%j==0)
break;
}
if(j>k)//全部循环完后,j>k,此时就是素数;因为只要中途退出一次就有j<=k
printf("%4d",i);
}
}
方法二,利用数组筛选
1.原理:1-100存放于数组中,首先1不是素数,筛掉;从2开始,能被整除的,即2的倍数,都不是,筛掉;然后是3,3的倍数筛掉;然后是5,7,11…
2. 思路:设置一个容量100的数组存放1-100;初始值为0;如果不为素数,置为1表示筛掉;最后遍历数组输出值为0的元素即可。
3. 目的:本例使用数组筛选的目的是使时间复杂度将到最低,所以还有其他利用数组筛选的方法。
#include<stdio.h>
#include<math.h>
#define N 100
int main()
{
int arr[N]={0}; //使用(索引+1)表示1-100个数
arr[0]=1; //1不是素数,首先筛选出来
int i; //i表示索引,也即元素
for(i=2;i<=N;i++) //第一轮:筛选掉2的倍数,
{
if(i%2==0)
{
arr[i-1] = 1;
}
}
arr[1] = 0; //2是素数,因为2也是2的倍数会在第一轮中被误筛
for(i=3;i<sqrt(N);i+=2)
{
if(arr[i-1]==0) //在第一轮筛选后的元素中继续筛选
{
//j表示3-100的元素;
//目的是将3的倍数置为1,依次4的倍数...
//注意这里的初值为i*i,增量为2*i
//之所以可以这么做,是因为3的倍数,除了本身,即乘1之外,乘2,为2的倍数(第一轮筛掉了),然后就是3乘3,所以初值为i*i;
//同理,3*4,pass;3*5=3*3+3*2;所以增量为2*i;依次...
for(int j=i*i;j<=N;j+=2*i)
{
arr[j-1]=1;
}
}
}
//打印数组
for(i=0;i<N;i++)
{
if(arr[i]==0)
{
printf("%2d ",i+1);
}
}
return 0;
}
参考来源:https://blog.csdn.net/weixin_38679924/article/details/88536802
有其他更简单的方法,欢迎指出。