我用 C 写了一段代码,但它不起作用?

I have written a code in C but it is not working?

问题:用 C 编写一个程序,从数组中找出质数。

我写了一个代码,但它不起作用。你能帮我看看问题出在哪里吗?

我的代码:

#include <stdio.h>

int main()
{
    int n, count = 0, x = 0;
    scanf("%d", &n);
    int numbers[n], prime[n];
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &numbers[i]);
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = 2; j < n; j++)
        {
            if (numbers[i] % j == 0)
            {
                x++;
                break;
            }
        }
        if (x > 0)
        {

        }
        else
        {
            prime[count] = numbers[i];
            count++;
        }
    }
    for (int i = 0; i < count; i++)
    {
        printf("%d ", prime[i]);
    }

    return 0;
}

请帮我找到解决办法。

提前致谢。

如果你想检查一个质数,你应该对 2,(value-1) 范围内的所有值进行检查,为此你应该按如下方式更正你的第二个循环:

    x = 0; // reset the counter
    for (int j = 2; j < numbers[i]; j++) { // corrected loop
         /* do your checks */
    }    

    /* EDIT: previous code was wrong as suggested in the comments */
    if (x==0 && numbers[i]!=1 && numbers[i]!=0) { // added to avoid 0 and 1 as prime nums
        /* store value */
    }

你的程序没有什么意义。

对于初学者来说,声明的数组应该具有元素类型 unsigned int 而不是 int.

因为用户可以在数组中输入任意数字然后这个循环

for (int j = 2; j < n; j++)

没有意义。

例如,如果 numbers[0] 等于 2,那么尽管 2 是一个质数,但您的程序不会将此数字视为质数。

此外,您忘记在内部 for 循环之前重新初始化变量 x

无需再定义第二个数组输出第一个数组中的质数

程序可以如下所示。

#include <stdio.h>

int main(void) 
{
    size_t n;
    
    if ( scanf( "%zu", &n ) == 1 && n != 0 )
    {
        unsigned int numbers[n];
        
        for ( size_t i = 0; i < n; i++ )
        {
            scanf( "%u", numbers + i );
        }
        
        for ( size_t i = 0; i < n; i++ )
        {
            int prime = numbers[i] % 2 == 0 ? numbers[i] == 2 : numbers[i] != 1;
            
            for ( unsigned int j = 3; prime && j <= numbers[i] / j; j +=2 )
            {
                prime = numbers[i] % j != 0;
            }
            
            if ( prime ) printf( "%u ", numbers[i] );
        }
        
        putchar( '\n' );
    }
    
    return 0;
}

如果输入是

25
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

那么输出将是

2 3 5 7 11 13 17 19 23 

我使用布尔函数来检查数字是否为素数

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

bool Prime(int);

int main()
{
int N;
do
{
   printf("Give me the number of numbers :");
   scanf("%d",&N);
}while(N<1);//in your array must be minimum 1 element
int prime[N];
int arr[N];
int j=0;

for(int i=0;i<N;i++)
{
   do
   {
       printf("Enter a number %d:",i+1);
       scanf("%d", &arr[i]);
   }while(arr[i]<0); 

   if(arr[i]!=1&&arr[i]!=0&&Prime(arr[i])==true)
   {
      prime[j]=arr[i];
      j++;
   }
}
  printf("\nListe of prime number :\n\n");

  for(int p=0;p<j;p++)
  {
      printf("[%d]",prime[p]);
  }

  printf("\n\n");
  return 0;
}


bool Prime(int n)
{
  for(int i=2;i<=(n/2);i++)
  {
      if(n%i==0)
      {
          return false;
      }
  }
  return true;
}

在我们深入研究这个问题之前,您需要做一些笔记: 而不是键入

if (x>0) { 
  }
else
//your code

这个可以直接

if (x<=0)
 //your code

如果 for 循环包含 1 条指令,则无需打开 {} 所以而不是

for (int i = 0; i < n; i++)
{
    scanf("%d", &numbers[i]);
}

可以直接输入

for (int i = 0; i < n; i++)
scanf("%d", &numbers[i]);

我还注意到您声明了一个变量 n,然后用它来声明数组的大小。那是错误的。 您需要使用 malloc 来拥有一个动态数组来执行您要求的相同功能。否则,使用静态数组并将 n 限制在其边界内。 阅读有关指针的更多信息。 关于你代码的问题,上面的回答已经解决了问题。