首先我先說一下什么是開燈問題:有從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;
}




