【问题标题】:I have written a code in C but it is not working?我用 C 写了一段代码,但它不起作用?
【发布时间】:2020-12-25 17:10:26
【问题描述】:

问题:用 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;
}

请帮助我找到解决方案。

提前致谢。

【问题讨论】:

  • 您不会重置x(作为计数器)。对于i 的每次迭代,您需要将其设置为 0。

标签: arrays c loops for-loop primes


【解决方案1】:

你的程序没有多大意义。

对于初学者,声明的数组应具有元素类型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 

【讨论】:

  • @MatteoPinna 你错了。 numbers[0] 等于 2 被认为是非素数。
  • 如果他将 x 重置为 0 并将循环停止条件更改为 j
  • @MatteoPinna 你为什么给我写这个?我在回答中指出了他的程序的所有这些缺点。
【解决方案2】:

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

#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;
}

【讨论】:

    【解决方案3】:

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

    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 限制在其边界内。 阅读更多关于指针的信息。 关于你的代码问题,上面的答案已经解决了这个问题。

    【讨论】:

      【解决方案4】:

      如果你想检查一个素数,你应该对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 */
          }
      
      

      【讨论】:

      • @SatyajitRoy 阅读我的答案后更改您接受的答案不是一个好行为..
      • 实际上我试图删除它是因为我错了,因为我认为 1 是质数,但我不能,因为它已经被接受了。顺便说一句,这与您的答案无关,我只是意识到 1 不是素数。
      • @MatteoPinna 阅读我的回答后,您意识到内部循环不正确。:)
      • 什么?我在 1 小时前发布了更正的内部循环,我唯一添加的是 if 检查,因此它不会将 1 视为质数。
      • @MatteoPinna 您对答案的更改不会使代码正确。例如 0 也不是素数,:)
      猜你喜欢
      • 2023-01-19
      • 1970-01-01
      • 2022-01-06
      • 2021-07-19
      • 2018-06-02
      • 2022-01-22
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多