Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.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
eratosthenes筛不起作用C++; 我尝试在一个特定的点上生成一个C++程序来生成所有素数,但是由于某种原因,它在2之后将所有的数字作为非素数打印出来。 int A[1000000]; void sieve(int till) { for(int i = 2; i < till; i++) { if(A[i] == 0) { for(int j = i*i; j < till; j+=i) { A[j - 1] = 1; //printf("%i is NOT prime\n", ij); } } } }_C++_Primes - Fatal编程技术网

eratosthenes筛不起作用C++; 我尝试在一个特定的点上生成一个C++程序来生成所有素数,但是由于某种原因,它在2之后将所有的数字作为非素数打印出来。 int A[1000000]; void sieve(int till) { for(int i = 2; i < till; i++) { if(A[i] == 0) { for(int j = i*i; j < till; j+=i) { A[j - 1] = 1; //printf("%i is NOT prime\n", ij); } } } }

eratosthenes筛不起作用C++; 我尝试在一个特定的点上生成一个C++程序来生成所有素数,但是由于某种原因,它在2之后将所有的数字作为非素数打印出来。 int A[1000000]; void sieve(int till) { for(int i = 2; i < till; i++) { if(A[i] == 0) { for(int j = i*i; j < till; j+=i) { A[j - 1] = 1; //printf("%i is NOT prime\n", ij); } } } },c++,primes,C++,Primes,但当我尝试调试时,它会说: NOT PRIME 0 NOT PRIME 1 NOT PRIME 2 PRIME 3 NOT PRIME 4 PRIME 5 NOT PRIME 6 PRIME 7 NOT PRIME 8 PRIME 9 NOT PRIME 10 PRIME 11 NOT PRIME 12 NOT PRIME 13 谁知道我做错了什么 编辑:由于A int表在主类之外,它会自动初始化为0s。您的代码存在许多问题 inta[1000000] 您尚未初始化数组。 您应该将A[0]=1

但当我尝试调试时,它会说:

NOT PRIME 0
NOT PRIME 1
NOT PRIME 2
PRIME 3
NOT PRIME 4
PRIME 5
NOT PRIME 6
PRIME 7
NOT PRIME 8
PRIME 9
NOT PRIME 10
PRIME 11
NOT PRIME 12
NOT PRIME 13
谁知道我做错了什么


编辑:由于A int表在主类之外,它会自动初始化为0s。

您的代码存在许多问题

  • inta[1000000]

    您尚未初始化数组。 您应该将
    A[0]=1
    A[1]=1
    和所有其他索引初始化为
    0

  • for(int j=i*i;j

    i*i
    可能导致整数溢出。您可能应该使用
    j=i+i
    来减少溢出的机会

  • A[j-1]=1

    不确定是否使用了正确的数组索引

  • 这一行:

    A[j - 1] = 1;
    
    应该是:

    A[j] = 1;
    
    因此,现在应该可以很好地工作:

    #include<stdio.h>
    
    int A[1000000];
    void sieve(int till)
    {
        for(int i = 2; i < till; i++)
        {
            if(A[i] == 0)
            {
                for(int j = i*i; j < till; j+=i)
                {
                    A[j] = 1;
                }
            }
        }
    }
    
    int main()
    {
        int N,i;
    
        scanf("%i", &N);
    
        for (i = 0;i < N;i++)
            A[i] = 0;
    
        sieve(N);
    
        for (i = 2;i < N;i++)
            if (A[i])
                printf("%i is not prime\n",i);
            else
                printf("%i is prime\n",i);
    }
    
    #包括
    INTA[1000000];
    空隙筛(整修)
    {
    for(int i=2;i
    非常简单。我们有几个小案例:

  • 0大于两个除数,所以它不是素数
  • 1只有一个除数,所以它不是素数
  • 2是唯一的素数偶数
  • 所以,基本上我们不应该计算偶数。我们只对奇数感兴趣

    我们将所有非素数标记为1

    int A[1000000];
    void sieve(int till)
    {
        // mark all even numbers (except 2) as not prime
        for(int i = 4; i < till; i += 2)
        {
            A[i] = 1;
        }
    
        // now calculate not primes for only odd numbers
        for(int i = 3; i < till; i += 2 )
        {
            if(A[i] == 0)
            {
                for(int j = i*i; j < till; j+=(i+i))
                {
                    A[j] = 1;
                }
            }
        }
    }
    
    int main()
    {
        int N;
        scanf("%i", &N);
        sieve(N);
    
        for(int i = 2; i < N; i++)
        {
            if(A[i] == 1) printf("%d is not prime\n", i);
            else printf("%d is prime\n", i);
        }
    
        return 0;
    }
    
    inta[1000000];
    空隙筛(整修)
    {
    //将所有偶数(2除外)标记为非素数
    对于(int i=4;i
    inta[1000000]
    这是在任何地方初始化的吗?谢谢!它现在可以工作了,我不知道为什么我真的把-1放在那里。
    I*I
    可能会溢出,但它会在
    j
    条件下被捕获。@PromeNabid不,它不会被捕获。如果
    i
    溢出,则未定义。假设
    j
    获取值
    -10
    <代码>吉现在知道了。它是整数溢出。
    int A[1000000];
    void sieve(int till)
    {
        // mark all even numbers (except 2) as not prime
        for(int i = 4; i < till; i += 2)
        {
            A[i] = 1;
        }
    
        // now calculate not primes for only odd numbers
        for(int i = 3; i < till; i += 2 )
        {
            if(A[i] == 0)
            {
                for(int j = i*i; j < till; j+=(i+i))
                {
                    A[j] = 1;
                }
            }
        }
    }
    
    int main()
    {
        int N;
        scanf("%i", &N);
        sieve(N);
    
        for(int i = 2; i < N; i++)
        {
            if(A[i] == 1) printf("%d is not prime\n", i);
            else printf("%d is prime\n", i);
        }
    
        return 0;
    }