#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
/*
* 求n以内的素数,并打印,反回素数的个数
* 主要算法为筛法
* 主要思想是: 素数的除1以外的倍数必然不是素数
* 将所有素数的倍数全部都"筛掉",那剩下的必然都是素数
*/
int print_prim(int n);
/*
* 求n以内的素数,并打印,反回素数的个数
* 主要算法为除法
* 主要思想是: 素数必然为除2以外的奇数,必然不可分解,如果一个数不是素数,那么它必然
* 可分解为两个不包括1的整数的乘积,并且这两个数中至少有一个数小于
* 这个数的开方根!
*/
int print_prim2(int n);
int main(int argc, char* argv[])
{
int n = 100;
if(argc == 2)
n = atoi(argv[1]);
print_prim(n);
print_prim2(n);
return 0;
}
//filter algrithom
int print_prim(int n)
{
int next = 2;
int i = next;
int flag = 1;
char* prim = (char*)malloc(n+1);//标志是否为素数
memset(prim, 1, n);
int t = 1;
int m = 0; //用于统计效率
while(next<=n)
{
//i*next 所有next的倍数必然不为素数,必然可分解为i*next
for(i = next;(t=i*next)<=n;i++)
{
m++;
prim[t] = 0;
}
next++;
//找到下一个质数
for(i = next; i < sqrt(n); i++)
{
m++;
if(prim[i] == 1)
{
next = i;
break;
}
}
}
int count = 0;
for(i = 1; i < n; i+=2)
{
if(prim[i] == 1)
{
printf("%d, ", i);
count ++;
}
}
printf("\n");
printf("filter efficiency = %d\n", m);
return count;
}
int print_prim2(int n)
{
int t;
int i = 1;
int m = 0; //用于统计效率
int flag = 1;
int count = 0;
for(i = 1; i < n; i+=2)
{
flag = 1;
int k = 2;
t = sqrt(i);
for(k = 2; k <= t; k++)
{
m++;
if(i%k==0)
{
flag = 0;
break;
}
}
if(flag)
{
count ++;
printf("%d, ", i);
}
}
printf("\ndevide effeicency = %d\n", m);
return count;
}