關於開關燈程式實現的整理

2021-10-09 21:52:26 字數 1473 閱讀 2574

最近做了一道程式實現的題目,題目大致如下:

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

輸入 輸入一組資料:n和k

輸出 輸出開著的燈編號

乍一看,這個題目其實是要解決兩個問題,乙個是如何找到n個數當中1~k的倍數,乙個是燈的開關是有記憶的,因為燈的開和滅與上一次操作時燈的開關狀態密切相關。如果能夠解決這兩個問題,那這道題目便可迎刃而解了。

for

(i =

1;i <= k; i++)}

}

2)記憶燈曾經的開關狀態。這裡常見的思路是建立乙個關於燈狀態的陣列,陣列的下標表示燈的標號,陣列的元素表示對應的燈的開關狀態,只要每次變化的時候查詢到對應的狀態,然後改變一下就好了。

int flag[

1001];

//……

//省略一些步驟直至探測到需要變化的元素

flag[j-1]

= flag[j-1]

==0?1

:0//需要改變的狀態的燈的變化

剩下的步驟就是將編號為1的燈進行輸出列印就好了

for

(i =

0;i < n;i++)}

for(i =

0;i < n;i++

)printf

("\n");

return

0;

綜上所述,該程式的實驗**如下

int

main

(int argc,

char

const

*ar**)

}}for(i =

0;i < n;i++)}

for(i =

0;i < n;i++

)printf

("\n");

return0;

}

其實回想了一下,燈的狀態只有兩種,一種是開,一種是關,或許我並不需要使用到陣列進行表示登記,畢竟只是單純的0和1的變化,是不是只需要我識別出對應的燈變化的次數就可以知道對應的狀態了呢?如果變化了奇數次就是亮,偶數次就是滅。

遵循著這個思路,我想到了二進位制逢二進一的特性,我只需要知道二進位制的最後一位數,是否就可以知道對應數值就可以知道滅和亮了。

實現**如下:

int

main

(int argc,

char

const

*ar**)

if(chage%2==

1)//變動偶數則關,變動奇數則開

}}

使用傾斜開關 微振動感測器在聲控開關燈中的應用

隨著數字技術的發展,利用數位電路技術實現自動照明 節能和延長燈具壽命變得越來越重要,這在我們的現實生活越來越常見。聲光控制電路已經成為人們日常生活中不可缺少的必需品,不需要開關,有人經過會自動開啟 廣泛應用於走廊 走廊招待所等公共場所,給人們的生活帶來極大的便利。聲控開關燈利用聲音來控制燈。聲控開關...

解 頭條的演算法面試題 圓環開關燈

1 這是個圓環,所以沒有邊界,要處理好陣列的邊界問題。2 100個燈泡,燈的數量是肯定的,這陣列的長度可以保證。3 開關燈規則,觸發乙個燈的開關會影響旁邊2個燈 取反 4 要所有燈泡都亮,那麼最後一次觸發肯定是3個連續暗的燈泡在一起的情況。開關燈,實現圓環的開關燈邏輯,注意處理一下陣列的邊界情況即可...

貓頭鷹的深夜翻譯 使用組合模式來開關燈

設計模式可能是部落格圈最熱門的話題之一。但是,用來說明每個設計模式的例子通常不是很形象。為了挽救這一點,這篇部落格將用乙個簡單有效的例子來解釋組合模式。我們不會再重複解釋這個模型的概念。唯一需要記住的是組合模式通常用在乙個樹結構的遞迴操作上。假設有一棟建築,這個建築有幾層樓,每層樓有幾個房間。這個建...