我已经编写了一个使用埃拉托斯特尼算法筛来查找素数的代码,但问题是我的代码按预期工作,但它显示了某些数字的未指定或未定义的错误。它显示“输入初始值(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;
}
数组中的元素数量以及数组元素的访问方式似乎不匹配。
与用数字加载数组相比,使用数组每个元素的索引号来表示每个数字更简单。然后在每个数组元素中存储一个 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;
}