首页 > 解决方案 > 打印 N 个以空格分隔的整数,表示所有素数后跟非素数

问题描述

#include <stdio.h>

int main()
{
  int a[100],m,n,i,j,flag,b[100];
  scanf("%d\n",&n);
  for(i=0;i<n;i++)
  {
      scanf("%d",&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 素数,后跟一个非素数。

标签: c

解决方案


素数从 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",&n))
        printf(" read failed \n");

    printf("enter %d numbers\n", n);
    
    for(i = 0; i < n; i++)
    {
        if(1 != scanf("%d",&Numbers[i]))
            printf("read error in loop\n");
    }
    
    printf("PRIMES\n");
    
    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;
}

推荐阅读