C语言
#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及之后规则一样,所以一个嵌套循环就够了