首先我先说一下什么是开灯问题:有从1到n一次编号的n个同学(有的题目中可能是猴子),1号同学将所有的灯都关掉;2号同学将编号为2的倍数的灯打开;3号同学则将编号为3的倍数的灯都做相反方向处理(该灯是打开的,关掉;是关掉的,打开.)让所有的同学都处理一遍后,问那些灯还是打开的.
这个题目本身不难,主要是怎么样才能使编码简单,大家都可能想到用array[i]=0来表示灯灭,array[i]=1表示灯亮.那怎么样做相反方向的操作呢?(呵呵,想一下);一般的可能想到用if条件语句判断,如果array[i]=0,则赋值为1,即:array[i]=1;如果array[i]=1;则array[i]=0.那是不是有更好的模拟灯的开关呢?我们说是有的,通过这条语句可以做到:array[1]=1-array[i];(思考一下!).
我的代码如下,仅供参考,有更好的可以贴出来讨论:
#include<stdio.h>
int main()
{
int n,array[1000],i,k,count;
scanf("%d",&count);
while(count--)
{
scanf("%d",&n);
for(i=1;i<=n;i++) //为了编码,从1开始.
{
array[i]=0;
}
for(i=2;i<=n;i++)
{
k=1;
while(i*k<=n)
{
array[i*k]=1-array[i*k]; //乒乓开关
k++;
}
}
for(i=1;i<=n;i++)
{
if(array[i])
{
printf("%d",i);
}
}
}
system("PAUSE");
return 0;
}