【发布时间】:2017-06-06 00:10:51
【问题描述】:
我正在尝试使用数组制作素数生成器。我从一维数组开始,但我的计算机上的最大限制是 250000。所以我想也许我应该制作一个二维或更多数组,以便在达到此限制后转到下一行,以避免我的 PC 出现问题。但我不知道该怎么做。欢迎任何帮助。
#include<stdio.h>
#include<math.h>
#include<stdbool.h>
#include<time.h>
#define LIMIT 250000ul
//prime number generator using arrays
void prime_generator(){
unsigned long long n;
printf("How many primes do you want generated : ");
scanf("%llu", &n);
unsigned long long p[LIMIT];
unsigned long long i, j=2;
unsigned long long num;
bool isPrime;
unsigned long long primes_per_line, space_column;
printf("How many primes do you want displayed per line? : ");
scanf("%llu", &primes_per_line);
printf("Enter space : ");
scanf("%llu", &space_column);
p[0]=2, p[1]=3;//first two primes
unsigned long long count = 2;
clock_t begin = clock();
for(num = 5;count < n; num=num+2){//only test for odd number
isPrime = true;
for(i = 1;i < j && p[i] <= sqrt(num) ;i++){
if(num%p[i]==0){
isPrime = false;
break;//break out of i loop
}
}
if(isPrime == true){
++count;
p[j] = num; //new prime found
++j;
}
}
clock_t end = clock();
double time_spent = (double) (end-begin)/CLOCKS_PER_SEC;
for(i = 0; i < n; i++){
if(i!=0 && i % primes_per_line == 0) printf("\n");
printf("%*llu", space_column, p[i]);
}
printf("\nCrunching time is : %.12f", time_spent);
}
int main(void){
prime_generator();
return 0;
}
【问题讨论】:
-
更改数组的维度不会增加您可用的内存量。
-
二维数组不会比一维数组占用更少的内存。考虑改用动态内存 - 即,调用
malloc。更好的是,改进您的算法,使其不需要那么多内存。 -
如果您的编译器没有“看到内部”
sqrt(num),那么该函数将被重复调用 - 不必要。建议unsigned long long limit = llrint(sqrt(num)); for(i = 1;i < j && p[i] <= limit;i++){ ...