您的位置:首页 > 其它

计算N以内质数的个数

2010-06-19 19:55 204 查看
总结两点:
  1、注意内存分配中int是占4个字节,不能分配多少个int就直接写多少个,而要乘以int的长度大小,因为它(malloc)分配的是字节数;
  2、能省则省,一开始我把isNotPrime声明为int,这样到99999999内存就太大了分配不了,后来改成char,至少节约3/4内存,可以测试更大的数;
完整代码如下,算法是网上看别人的算法:

/**
* 计算2~N的质数
* skchen @ 2009-08-29 22:26
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define N 999999999

main() {
int i = 0;
int *numbers;
char *isNotPrime;
int j = 0;
int count = 0;
numbers = malloc(N / 2);
isNotPrime = malloc(N * sizeof(char));
for (i = 0; i < N; i++) {
isNotPrime[i] = 0;
if (i < (N / 8)) {
numbers[i] = 0;
}
}

for (i = 2; i < N; ++i) {
if (isNotPrime[i] == 0) {
numbers[count] = i;
//printf("%d,", i);
count++;
for (j = i + i; j < N; j += i) {
isNotPrime[j] = 1;
}
}
}
printf("总共%d个质数/n", count);
printf("CPU运行时间:%d", clock());
free(numbers);
free(isNotPrime);
}


稍微修改了下算法,在我的电脑上至少可以计算这么大的范围了:

/**
* 计算2~N的质数
* skchen @ 2009-08-30 04:58
*/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define N 2999999999

main() {
unsigned long int i = 0;
//int *numbers;
char *isNotPrime;
unsigned long int j = 0;
unsigned long int count = 0;
//numbers = malloc(N / 8);
isNotPrime = malloc(N * sizeof(char) / 2);
for (i = 0; i < N / 2; i++) {
isNotPrime[i] = 0;
//if (i < (N / 32)) {
//    numbers[i] = 0;
//}
}

//numbers[0] = 2;
count++;
for (i = 3; i < N; i += 2) {
if (isNotPrime[(i - 1) / 2] == 0) {
//numbers[count] = i;
//printf("%d,", i);
count++;
if (i < N / 2) {
for (j = i + i; j < N && j < N - i; j += i) {
if (j % 2 == 0) {
continue;
}
isNotPrime[(j - 1) / 2] = 1;
}
}
}
}
printf("总共%d个质数/n", count);
printf("CPU运行时间:%d", clock());
//free(numbers);
free(isNotPrime);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: