素数统计
题目如下:【问题描述】
这题意思非常简单,给你一个正整数n,你需要求出有多少个质数小于等于n。
【输入】
输入文件仅一行,包括一个正整数n。
【输出】
仅一行,一个整数表示有多少个质数小于等于n。
输出后请注意换行
【输入输出样例】
prime.in
100
prime.out
25
【数据规模】
30%的数据满足:n <= 1000。
50%的数据满足:n <= 200000。
100%的数据满足:1 <= n <= 2000000。
【时间要求】
1s
这题意思非常简单,给你一个正整数n,你需要求出有多少个质数小于等于n。
【输入】
输入文件仅一行,包括一个正整数n。
【输出】
仅一行,一个整数表示有多少个质数小于等于n。
输出后请注意换行
【输入输出样例】
prime.in
100
prime.out
25
【数据规模】
30%的数据满足:n <= 1000。
50%的数据满足:n <= 200000。
100%的数据满足:1 <= n <= 2000000。
【时间要求】
1s
下面是我写的代码, 感觉效率还能够提高..
程序代码:
#include <stdio.h> #include <stdlib.h> 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之间的所有素数作为一个数组保存起来, 然后...(之间省略..) 不过这种算法我感觉不好...
总之我感觉我的代码还有提升的价值, 也想看看各位的代码...