题目:判断 101-200之间有多少个素数,并输出所有素数。
解法一:遍历求
#include <stdio.h>
#include <math.h>
int main(){
int i,j,s=0,flag=0;
for(i=101;i<200;i++){
for(j=2;j<=sqrt(i);j++){
if(i%j==0){
flag=1;
break;
}
}
if(!flag){
s++;
printf("No.%d\t%d\n",s,i);
}
flag=0;
}
return 0;
}
解法二:欧拉筛
#include <stdio.h>
#include <stdbool.h> // 使用布尔型bool数组存筛选情况
#include <math.h> // 调用开方函数
#include <time.h> // 记时用
#define N 9999999 // 待计算的最大区间
bool flag[N]; // 相应数组下标值为false即代表该下标所对应值为素数【静态内存区,默认初始值全部为零】
void fun(long long n){ // 筛法实现
long long i,j;
int l;
l=sqrt(n+0.5);
for(i=2;i<=l;i++){
if(!flag[i])
for(j=i*i;j<=n;j+=i)
flag[j]=1; // 筛去所有非质数
}
}
int main(){
long long i; // 数组遍历使用的索引下标
long long c=0; // 区间内素数个数,记数用
clock_t a,b; // 始末时间,计时用
double t; // 计算总时长,不包含打印输出时间
a=clock(); // 调用前时间
fun(N); // 调用计算函数
b=clock(); // 调用后时间
t=(double)(b-a)/CLOCKS_PER_SEC; // 计算时间差
for(i=2;i<=N;i++){ // 数据输出
if(!flag[i]){
printf("%-8lld",i);
c++;
}
}
printf("\n\n--------------------------------");
printf("\n[2 ~ %lld]",N);
printf("\nSUM:%lld\tTIME: %lfS",c,t);
return 0;
}