头歌实训:求素数个数
任务描述
本关任务:编写一个程序,求[1,n]之间的素数个数。
实验目的:通过对比同一问题不同解法的绝对执行时间,体会如何设计“好”的算法。
实验内容:编写一个程序,求[1,n]的素数个数。要求采用两种解法实现函数is_prime(int n)。
编程要求
根据提示,在右侧编辑器补充代码,要求分别用两种方法实现函数is_prime(int n)。
测试说明
平台会对你编写的代码进行测试:
测试输入:10000
预期输出:
Time elapsed is: 0.001000 seconds
The number of prime is: 1229
测试输入:20001
预期输出:
Time elapsed is: 0.002000 seconds
The number of prime is: 2262
测试输入:100010
预期输出:
Time elapsed is: 0.014000 seconds
The number of prime is: 9593
开始你的任务吧,祝你成功!
源代码:
#include <stdio.h>
#include <time.h> //clock_t, clock, CLOCKS_PER_SEC
#include <math.h> //sqrt(n)
//如果正整数n是素数, 返回true;否则返回false
bool is_prime(int n)
{
//请在下面编写代码
/***************Begin**************/
if (n == 1) return false;
for (int i = 2; i <= (int)sqrt(n); i++){ //n不会比根号n还大的整数整除
if (n % i == 0) return false;
}
return true;
/****************End***************/
}
void CountPrime(int n) //耗时统计
{
clock_t t;
int sum = 0, i;
t = clock(); //算法起始时间
for (i = 2; i <= n; i++)
if (is_prime(i))
sum++;
t = clock() - t; //算法结束时间
//printf("Time elapsed is: %lf seconds\n" , ((double)t) / CLOCKS_PER_SEC); //换算为秒
printf("The number of prime is: %d\n", sum); //打印素数个数
}
//测试程序
int main()
{
int n;
scanf("%d", &n);
if (n < 10000) return 0;
CountPrime(n);
return 0;
}