首先我先说一下什么是开灯问题:有从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;
}