Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中素数筛的修改_C_Primes - Fatal编程技术网

C语言中素数筛的修改

C语言中素数筛的修改,c,primes,C,Primes,网上有许多埃拉托斯坦筛的实现。通过搜索谷歌,我发现 这显然是错误的。我认为我的错误在于我对psuedocode的解释 作为 for(k=limit;k

网上有许多埃拉托斯坦筛的实现。通过搜索谷歌,我发现

这显然是错误的。我认为我的错误在于我对psuedocode的解释

作为

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;

}