程序到底哪里出错了?求解

C语言

img

#include <stdio.h>
int  main()
{
    int n,m,h,i,j,f;
    int a[5000]={1};
    scanf("%d %d",&n,&m);
    if (n<=5000 && m<=n)
 {
        for(i=-1;i<=4998;i++)
        {
            a[i]=-1;
        }
        for(i=2;i<m;i++)
      {  
         h=i;
         for(j=h;j<=n;)
         {
          h=h*i;
          a[j]=-a[j];
         }
      }
     for (f=0;f<=n;f++)
     {
         if (a[f]=-1)
         {   
             printf("%d",f);
         }
     } 
 }
return 0;
}

代码修改如下:

#include <stdio.h>
int  main()
{
    int n,m,h,i,j,f;
    int a[5000]={1};
    scanf("%d %d",&n,&m);

    //全部关闭
    for(i=0;i<n;i++)
        a[i]=0;
    
    if(m==1)
    {
        printf("灯全部关闭\n");
        return 0;
    }

    //printf("2:");
    //第二个人,将2的倍数的灯打开
    f = 0;
    for(i=0;i<n;i++)
    {
        if((i+1)%2 == 0)
            a[i] = 1;
        if(a[i] == 0)
            f++;
    }
    
    if(m==2)
    {
        for (i=0,j=0;i<n;i++)
        {
            if(a[i] == 0)
            {
                if(j<f-1)
                    printf("%d,",i+1);
                else
                    printf("%d\n",i+1);
                j++;
            }
        }
        return 0;
    }
    
    h = 3;
    while(h<=m)
    {
        f = 0; //记录关闭的灯的个数
        for(i=0;i<n;i++)
        {
            //是h倍数的都翻转
            if((i+1)%h == 0)
            {
                if(a[i] == 0)
                    a[i] = 1;
                else
                    a[i] = 0;
            }
            if(a[i] == 0)
                f++;
        }
        h++;
    }
    for (i=0,j=0;i<n;i++)
    {
        if(a[i] == 0)
        {
            if(j<f-1)
                printf("%d,",i+1);
            else
                printf("%d\n",i+1);
            j++;
        }
    }


    return 0;
}

int a[5000]={1};只是将第一个数设置为1,其它数还是0
if (n<=5000 && m<=n) n不能等于5000,否则最后一个循环中当f=n时会溢出

第九行那里,数组越界了。
这题不需要1,2单独提出来写,反正都是看倍数,1的倍数,2的倍数这样的规则和后面3及之后规则一样,所以一个嵌套循环就够了