我用于查找质数的 C 代码的错误查找和纠正

问题描述 投票:0回答:1

The error that I'm struggling, with some examples

我已经编写了一个使用埃拉托斯特尼算法筛来查找素数的代码,但问题是我的代码按预期工作,但它显示了某些数字的未指定或未定义的错误。它显示“输入初始值(n)无限次”作为错误,对于我在图像中提到的某些数字,它工作得很好。当我最近开始深入研究 C 时,我找不到问题所在。我请求代码们在这种情况下帮助我,并帮助我认识到错误是什么,为什么会发生以及如何防止它。

编辑:实际上,对于较小的数字,它会进入错误区域,随着数字的增长,它工作正常,但对于某些数字,它会再次陷入错误,如指定的图像中所示。

这是代码(已修改以避免垃圾值):

#include <stdio.h>
int main()
{
    int n;
    printf("enter number: ");
    scanf("%d",&n);
    int arr[n],pr=2;
    for(int i=0;pr<=n;i++)
    {
        arr[i]=pr;
        pr++;
    }
    int j,k=0;
    while(arr[k]<=n)
    {
        for(j=2;j<n;j++)
        {
            for(k=0;k<n;k++)
            {
                if(arr[k]%j==0 && arr[k]>j)
                    arr[k]=0;
            }
        }
    }
    for(int i=0;i<n;i++)
    {
        if(arr[i]>0)
            printf(" %d",arr[i]);
    }
    printf("\n");
    return 0;
}
arrays c primes sieve-of-eratosthenes
1个回答
0
投票

数组中的元素数量以及数组元素的访问方式似乎不匹配。

与用数字加载数组相比,使用数组每个元素的索引号来表示每个数字更简单。然后在每个数组元素中存储一个 true 或 false 值(一个指示所表示的数字是否是质数的标志)。也就是说,例如,如果 arr[5] 的值为 1(真),则表示数字 5 被视为素数。

此外,当使用

for
循环时,让循环的所有三个表达式使用相同的变量总是一个好主意。您的第一个
for
循环首先使用 i 。然后是 pr 和 n。然后循环再次使用 i。最好是用一个变量控制
for
循环的所有三个部分,尤其是在开始时。

*/ Sieve of Eratosthenes.c
   standard implementation without the usual optimizations
*/

#include <stdio.h>
#include <stdbool.h>

int main(void)
{
    int n;
    printf("enter number (limit): ");
    scanf("%d",&n);

    int arr[n + 1];                  // include space for array element 0
    for (int i = 2; i <= n; ++i) {   // skip array elements 0 and 1
        arr[i] = true;               // mark elements 2 to n as true (prime)
    }

    for (int i = 2; i <= n; ++i) {   // skip array elements 0 and 1
        if (arr[i]) {                // if true (prime)
            for (int j = i + i; j <= n; j += i) {  // cross off multiples
                arr[j] = false;      // mark element as false (not prime)
            }
        }
    }

    for (int i = 2; i <= n; ++i) {   // skip array elements 0 and 1
        if (arr[i]) {                // if true (prime)
            printf(" %d", i);        //     print array element number  
        }
    }
    printf("\n");

    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.