浏览 3572 次
锁定老帖子 主题:求<=n的所有素数
精华帖 (0) :: 良好帖 (0) :: 新手帖 (9) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-10-24
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char **argv) { if (argc != 2) { printf("Usage: ./a.out <num>\n"); exit(EXIT_FAILURE); } int n = atoi(argv[1]); int arr[n + 1]; // init int i; for (i = 0; i <= n; i++) arr[i] = i; int p; for (p = 2; p < n; p++) for ( i = p + 1; i <= n; i++) if (i % p == 0) arr[i] = 0; // display all prime number for (i = 0; i <= n; i++) if (arr[i] != 0) printf("%d\n", arr[i]); exit(EXIT_SUCCESS); } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-10-30
你这个程序好像有点问题哦。
1.程序会把1作为质数输出(根据质数定义,1显然不是质数) 2.效率比较低哦,一般的算法书都有更好的解法。 import java.util.*; public class MathTest { public static void main(String[] args) { if(args.length < 1) { return; } int k = Integer.parseInt(args[0]); if(k <= 0) { return; } boolean isPrime; List<Integer> primeList = new ArrayList<Integer>(); for(int i = 2; i <= k; i++) { isPrime = true; for(int j = 2; j <= (int)Math.sqrt(i); j++) { if( i % j == 0) { isPrime = false; break; } } if(isPrime) { primeList.add(i); } } } } |
|
返回顶楼 | |
发表时间:2008-10-30
谢谢superloafer的提醒:)
我把算法优化了下,详见下: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <math.h> #define IS_PRIME 1 int main(int argc, char **argv) { if (argc != 2) { printf("Usage: ./a.out <num>\n"); exit(EXIT_FAILURE); } int n = atoi(argv[1]); int primes[n + 1]; int rsqrt = (int)sqrt(n) + 1; int i; int p; // init memset(primes, 0, sizeof(primes)); primes[2] = IS_PRIME; for (i = 3; i <= n; i += 2) primes[i] = IS_PRIME; for (p = 3; p <= rsqrt; p += 2) for ( i = p + 2; i <= n; i += 2) { if (!primes[i]) continue; primes[i] = i % p; } // display all prime numbers for (i = 0; i <= n; i++) if (primes[i]) printf("%d\n", primes[i]); exit(EXIT_SUCCESS); } |
|
返回顶楼 | |