素数统计
题目如下:
【问题描述】
这题意思非常简单,给你一个正整数n,你需要求出有多少个质数小于等于n。
【输入】
输入文件仅一行,包括一个正整数n。
【输出】
仅一行,一个整数表示有多少个质数小于等于n。
输出后请注意换行
【输入输出样例】
prime.in
100
prime.out
25
【数据规模】
30%的数据满足:n <= 1000。
50%的数据满足:n <= 200000。
100%的数据满足:1 <= n <= 2000000。
【时间要求】
1s
下面是我写的代码, 感觉效率还能够提高..
程序代码:#include
#include
int main(void)
{
int i, j, n;
int count = 1; /*直接包括了2这个素数, 能够减少一半循环*/
int *prime;
scanf("%d", &n);
if(n < 1 || n > 2000000){ /*这一段代码在题目中不需要,, 但是作为程序
的话还是要考虑是否健壮, 不然calloc将会出错*/
exit(-1);
}
if(n < 2){ /*如果是1的话..*/
count--;
}
prime = calloc(sizeof(int), n);
for(i = 3; i <= n; i += 2){ /*偶数必定不是素数..*/
if(prime[i] == 1){
continue;
}
count++;
for(j = 2 * i; j <= n; j += i){
prime[j] = 1;
}
}
printf("%d\n", count);
return 0;
}其实有一种算法肯定是最快的(无与伦比), 就是把1~2000000之间的所有素数作为一个数组保存起来, 然后...(之间省略..) 不过这种算法我感觉不好...
总之我感觉我的代码还有提升的价值, 也想看看各位的代码...