C语言中素数筛的修改
网上有许多埃拉托斯坦筛的实现。通过搜索谷歌,我发现 这显然是错误的。我认为我的错误在于我对psuedocode的解释 作为C语言中素数筛的修改,c,primes,C,Primes,网上有许多埃拉托斯坦筛的实现。通过搜索谷歌,我发现 这显然是错误的。我认为我的错误在于我对psuedocode的解释 作为 for(k=limit;k
for(k=limit;k
由于我是C语言的新手,我可能犯了一个基本的错误。我不确定上面的五行代码有什么问题,因此提出了一个关于堆栈溢出的问题。您的循环语句有一些问题,
j
变量应该用于素数的索引,即指向具有0或1值的int数组的指针。您可以使用primes
数组,在这种情况下,在算法中是S(k)
for (k=limit; k < limit*limit; k++)
for (j = primes[0]; j = arr[sizeof(arr)/sizeof(arr[0]) - 1]; j++)
if ((k % j) == 0)
arr[k]=0;
arr[k] = 1;
和if
语句中的条件应为
if (primes[j] && (k % j) == 0)
{
arr[k] = 0;
break;
}
如果这个条件为真,我们应该使用j
变量退出内部for循环。对于带有j
的外部for循环,应检查j
变量的值,以检查内部循环是否完成(j==limit)
这是我修改的整个for循环(外循环和内循环)
for (k = limit; k < limit*limit; k++)
{
for (j = 2; j < limit; j++)
{
if (primes[j] && (k % j) == 0)
{
arr[k] = 0;
break;
}
}
if (j == limit) arr[k] = 1;
}
for(k=limit;k
下面是整个解决方案:
#include <stdio.h>
#include <stdlib.h>
#define limit 10 /*size of integers array*/
int main() {
unsigned long long int i, j, k;
int *primes;
int arr[limit*limit];
int z = 1;
primes = (int*)malloc(sizeof(int) * limit);
for (i = 2; i < limit; i++)
primes[i] = 1;
for (i = 2; i < limit; i++)
if (primes[i])
for (j = i; i * j < limit; j++)
primes[i * j] = 0;
/* Code which prints out primes for Sieve of Eratosthenes */
/*printf("\nPrime numbers in range 1 to 100 are: \n");
for (i = 2;i < limit; i++)
if (primes[i])
//printf("Element[%d] = %d\n", i, primes[i]);*/
for (k = limit; k < limit*limit; k++)
{
for (j = 2; j < limit; j++)
{
if (primes[j] && (k % j) == 0)
{
arr[k] = 0;
break;
}
}
if (j == limit) arr[k] = 1;
}
printf("\nPrime numbers in range k to k^2 are: \n");
for (k = limit; k < limit*limit; k++)
if (arr[k] == 1)
printf("Element %d\n", k);
return 0;
}
#包括
#包括
#定义整数数组的限制10/*大小*/
int main(){
无符号长整型i,j,k;
int*素数;
int arr[限制*限制];
intz=1;
素数=(int*)malloc(sizeof(int)*极限);
对于(i=2;i
我根本没有进入算法,但很明显,在第二个for
语句中,您将赋值给j
,而不是在语句的条件部分进行比较。是的,我也注意到了这一点。就在这里:j=arr[sizeof(arr)/sizeof(arr[0])-1]代码>同样,您可能需要为外部循环的主体使用大括号,以便语句arr[k]=1代码>是循环的一部分。现在,当代码结构让它相信它是的时候,它不是。
for (k=limit; k < limit*limit; k++)
for (j = primes[0]; j = arr[sizeof(arr)/sizeof(arr[0]) - 1]; j++)
if ((k % j) == 0)
arr[k]=0;
arr[k] = 1;
for (j = 2; j < limit; j++)
if (primes[j] && (k % j) == 0)
{
arr[k] = 0;
break;
}
if (j == limit) arr[k] = 1;
for (k = limit; k < limit*limit; k++)
{
for (j = 2; j < limit; j++)
{
if (primes[j] && (k % j) == 0)
{
arr[k] = 0;
break;
}
}
if (j == limit) arr[k] = 1;
}
#include <stdio.h>
#include <stdlib.h>
#define limit 10 /*size of integers array*/
int main() {
unsigned long long int i, j, k;
int *primes;
int arr[limit*limit];
int z = 1;
primes = (int*)malloc(sizeof(int) * limit);
for (i = 2; i < limit; i++)
primes[i] = 1;
for (i = 2; i < limit; i++)
if (primes[i])
for (j = i; i * j < limit; j++)
primes[i * j] = 0;
/* Code which prints out primes for Sieve of Eratosthenes */
/*printf("\nPrime numbers in range 1 to 100 are: \n");
for (i = 2;i < limit; i++)
if (primes[i])
//printf("Element[%d] = %d\n", i, primes[i]);*/
for (k = limit; k < limit*limit; k++)
{
for (j = 2; j < limit; j++)
{
if (primes[j] && (k % j) == 0)
{
arr[k] = 0;
break;
}
}
if (j == limit) arr[k] = 1;
}
printf("\nPrime numbers in range k to k^2 are: \n");
for (k = limit; k < limit*limit; k++)
if (arr[k] == 1)
printf("Element %d\n", k);
return 0;
}