演算法篇-開燈問題

不被看好的青春叫成長發表於2015-04-02

題目:有n盞燈,編號1~n.第1個人把所有燈開啟,第2個人按下所有編號為2的倍數的開關(這些燈將被關掉),第3個人按下所有編號為3的倍數的開關(其中關掉的燈將被開啟,開著的燈將被關閉),依次類推。一共有k個人,問最後有哪些燈開著?輸入n和k,輸出開著的燈編號。k<=n<=1000;

樣例輸入:7 3

樣例輸出:1 5 6 7

 

程式碼如下:

#include <iostream>
#include <cstring>
#define MAXN 1001                //陣列開大點
using namespace std;
int a[MAXN];
int main()
{
    int i,j,n,k,first=1;
    memset(a,0,sizeof(a));
    cin>>n>>k;
    for (i=1;i<=k; i++)
    {
        for(j=1; j<=n; j++)
        {
            if (j%i==0)
                a[j]=!a[j];
        }
    }
    for(i=1; i<=n; i++)
        if (a[i])
        {
            if(first)
                first=0;
            else
                cout<<" ";
            cout<<i;
        }
    return 0;
}


執行結果:

 

題目感覺還是有點難度的,至少我看見題目第一眼沒想出怎麼寫好,看了書上的c語言程式碼才有了想法,從這個題目中學到了兩點:

1:!不是取負,而是將0變成1或1變成0(這是我自己認為的,百度搜不到,也不知道是不是正確的)。以前一直以為就是取負。

2:可以通過設定標誌變數來避免輸出多餘空格。如題,第一個i前面是沒有空格的,當輸出第一個i後再輸出i前會輸出一個空格。

相關文章