【发布时间】:2013-11-26 21:56:07
【问题描述】:
我正在尝试在 C 中设计一个 Eratosthenes 筛子,但我遇到了两个我无法弄清楚的奇怪问题。这是我的基本程序大纲。要求用户设置显示素数的范围。如果范围最小值小于 9,则将最小值设置为 9。用范围内的所有奇数填充一个数组。
1) 我试图通过像这样声明可变大小的数组来减少内存使用:
if (max<=UINT_MAX)
unsigned int range[(max-min)/2];
else if (max<=ULONG_MAX)
unsigned long int range[(max-min)/2];
else if (max<=ULLONG_MAX)
unsigned long long int range[(max-min)/2];
为什么不编译?变量 min 和 max 之前被声明为 ints 并且包括 limits.h。我已经注释掉了选择结构,现在只声明了unsigned long long int range[(max-min)/2];,它现在可以编译和工作。
2) 我的代码可以运行,但有时会将小素数标记为非素数。
#include<stdio.h>
#include<limits.h>
void prime(int min, int max)
{
int i, f=0;
//declare variable size array
/*if (max<=(int)UINT_MAX)
unsigned int range[(max-min)/2];
else if (max<=(int)ULONG_MAX)
unsigned long int range[(max-min)/2];
else if (max<=(int)ULLONG_MAX)*/
unsigned long long int range[(max-min)/2];
//fill array with all odd numbers
if (min%2==0)
{
for (i=min+1;i<=max;i+=2)
{
range[f]=i;
f+=1;
}
}
else
{
for (i=min;i<=max;i+=2)
{
range[f]=i;
f+=1;
}
}
//assign 0 to cell if divisible by any number other than itself
for (i=3;i<=sqrt(max);++i)
{
for (f=0;f<=((max-min)/2);f++)
{
if (range[f]%i==0 && f!=i)
range[f]=0;
}
}
//troubleshoot only: print full range
for (f=0;f<=((max-min)/2);f++)
{
printf("ALL: %d / %d\n", f, range[f]);
}
//display all primes
if (min==9) /*print primes lower than 9 for ranges where min<9*/
printf("2\n3\n5\n7\n");
for (f=0;f<=((max-min)/2);f++) /*print non 0 numbers in array*/
{
if (range[f]!=0)
printf("%d\n", range[f]);
}
}
int main(void)
{
int digits1, digits2;
printf("\n\n\nCalculate Prime Numbers\n");
printf("This program will display all prime numbers in a given range. \nPlease set the range.\n");
printf("Minimum: ");
scanf("%d", &digits1);
if (digits1<9)
digits1=9;
printf("Maximum: ");
scanf("%d", &digits2);
printf("Calculating...");
printf("All prime numbers between %d and %d are:\n", digits1, digits2);
prime(digits1, digits2);
getchar();
getchar();
}
例如,如果 digits=1 和 digits2=200 我的程序输出 1 和 200 之间的所有素数,但 11 和 13 除外。11 和 13 被筛选出来,我不明白为什么这种情况会发生在越来越多的低数字上随着digits2的增加。
3) 最后,我的筛子是否是合适的埃拉托色尼筛子?它有点工作,但我觉得有一种更有效的方法来筛选非素数,但我不知道如何实现它。我对这个程序的目标之一是尽可能高效。同样,我现在拥有的是:
//assign 0 to cell if divisible by any number other than itself
for (i=3;i<=sqrt(max);++i)
{
for (f=0;f<=((max-min)/2);f++)
{
if (range[f]%i==0 && f!=i)
range[f]=0;
}
}
感谢您阅读所有内容!很抱歉再次发布与eratosthenes 相关的问题,并提前感谢您的帮助!
【问题讨论】:
-
1.您不能像您尝试做的那样对单个变量进行多个声明;根本不允许。为了进一步减少内存使用,将数组视为位图,并且只记录图中的奇数。
标签: c primes sieve-of-eratosthenes