开关灯问题(c),菜鸟级,帮忙修改

来源:百度知道 编辑:UC知道 时间:2024/08/25 04:08:36
Description

n盏灯排成一排,从1到n按顺序依次编号。有n个人也从1到n依次编号。第一个人(1号)将灯全部关闭。第二个人(2号)将凡是2和2的倍数的灯打开。第三个人(3号)将凡是3和3的倍数的灯作相反处理(该灯如为打开的将其关闭;如为关闭的,将其打开)。以后的人都和三号一样,将凡是与自己相同的灯和是自己编号倍数的灯作相反处理。请问,当第n个人操作之后,哪几盏灯是点亮的。

Input

共1行。
第1行只有一个整数,即灯的数目n(1≤n≤10000)。

Output

共1行,按从小到大的顺序输出第n个人操作之后还点亮的灯的编号,每两个编号之间用空格隔开。

Sample Input

6

Sample Output

2 3 5 6
我的程序如下,但输出结果不对,帮忙指出错误,谢了
# include <stdio.h>
int main()
{
int light[10001];
int no[10001];
int i,g,n;
scanf("%d",&n);
for(g=1;g<=n;g++)
{
light[g]=0;
no[g]=g;
}
for(g=1;g<=n;g++)
{for(i=n;i>=g;i--)
if(i%g==0) light[g]=light[g]+1;}
for(g=1;g<=n;g++)
{if(light[g]%2==0) printf("%d ",no[g]);}//如果灯的被操作次数是二的整数倍,则此灯是亮的。

return 0;

}

if(i%g==0) light[g]=light[g]+1;}

这里写错了

应该是
light[i]=light[i]+1;

意思是如果i是g的倍数,则g可以开(关)i这个灯。这时候应该是记录i这个灯的被操作次数,而不是记录g这个人的操作次数。

你的代码我没太明白 我自己写了一段你看看吧!
#include <stdio.h>
#define LIGHT 10000

int main()
{
int light[LIGHT];
int p;
int n;
int m;
scanf("%d",&n);
for (p=1;p<=n;p++)
{
light[p]=p;//有多少人就有多少灯 给灯编号
}
for (p=1;p<=n;p++)
{
for (m=1;m<=n;m++)
{
if (light[m]%p==0)
{
light[m]*=-1;
}

}
}
for (p=1;p<=n;p++)
{
if (light[p]>0)//正数代表开灯
{
printf("%d\n",p);
}
}

return 0;

}