Вывести N целых чисел через пробел, представляющих все простые числа, за которыми следуют не простые числа

#c

#c

Вопрос:

 #include <stdio.h>

int main()
{
  int a[100],m,n,i,j,flag,b[100];
  scanf("%dn",amp;n);
  for(i=0;i<n;i  )
  {
      scanf("%d",amp;a[i]);
  }
  for(i=0;i<n;i  )
  {
      m=a[i];
      flag=0;
      for(j=0;j<=m;j  )
      {
          if(m%j==0){
              flag=flag 1;
          }
      }
      if(flag==2){
          b[i]=m;
          printf("%d",b[i]);
      }
  }
}
  

Я пытаюсь ввести n входных данных массива и распечатать только простые числа. Но результат, который я получил для приведенного выше кода:

 OUTPUT:
    5
    7 4 2 6 5
    Floating-point exception(core dumped)
  

Я хотел, чтобы на выходе было 7 2 5 4 6 простое число, за которым следует не простое число.

Комментарии:

1. m%j это неопределенное поведение, когда j равно 0. В этом случае вы получите FPE (разделите на 0).

2. if(m%j==0){ В этом проблема. Вы начинаете с j =0

3. О, понял. Но можете ли вы сказать, как напечатать все простые числа, за которыми следуют не простые числа?@ SerialLazer@kaylum

4. Если вы собираетесь использовать scanf (вы не должны), вы должны проверить его возвращаемое значение. Всегда.

5. хорошо @WilliamPursell

Ответ №1:

простое число начинается с 2, но если ваш ввод имеет 0 и 1, примите их также во внимание при проверке. Есть лучшие способы найти простое число, для простоты я использовал то же, что и OP.

 #include <stdio.h>
#define MAX_SIZE 100

int main()
{
    //int a[MAX_SIZE],m,n,i,j,flag,b[MAX_SIZE];
    // use better names for readability
    int Numbers[MAX_SIZE]; // stores all the numbers
    int m,n,i,j,flag;
    
    printf("nEnter the number for PRIME range:");

    if(1 != scanf("%d",amp;n))
        printf(" read failed n");

    printf("enter %d numbersn", n);
    
    for(i = 0; i < n; i  )
    {
        if(1 != scanf("%d",amp;Numbers[i]))
            printf("read error in loopn");
    }
    
    printf("PRIMESn");
    
    for(i = 0; i < n; i  )
    {
        m = Numbers[i];
        flag = 0;
        if(m == 0 || m == 1) 
            continue;

        // there are better ways to find prime , but using same as OP for simplicity
        for(j = 1;j <= m; j  )
        {
          if( m % j == 0)
          {
              flag = flag   1;
          }
        }
        // 1 and itself , so prime
        if(flag == 2)
        {
            printf("%d ", m);
        }
    }
    return 0;
}
  

Комментарии:

1. Вы должны проверить значение , возвращаемое scanf . При вводе «foobar» первый scanf не изменит n, а цикл for повторяется от 0 до неопределенного числа и может переполнить массив. Всегда проверяйте значение, возвращаемое scanf.