面試題:亮著電燈的盞數
阿新 • • 發佈:2020-12-09
每日刷題(八十五)
題目描述
一條長廊裡依次裝有n(1≤n≤65535)盞電燈,從頭到尾編號1、2、3、…n-1、n。每盞電燈由一個拉線開關控制。開始,電燈全部關著。
有n個學生從長廊穿過。第一個學生把號碼凡是1的倍數的電燈的開關拉一下;接著第二個學生把號碼凡是2的倍數的電燈的開關拉一下;接著第三個學生把號碼凡是3的倍數的電燈的開關拉一下;如此繼續下去,最後第n個學生把號碼凡是n的倍數的電燈的開關拉一下。n個學生按此規定走完後,長廊裡電燈有幾盞亮著。
注:電燈數和學生數一致。不能寫笨拙的雙重迴圈(優化過的是可以的),會執行超時。本題有執行時間限制(一說10000ms)。
輸入:
電燈的數量
輸出:
Ni(亮燈的編號)(編號是從1到n) is light
Ni + 1 is light
…
亮著的電燈總數量
樣例輸入:
3
樣例輸出:
1 is light
1
思路分析
第一個學生拉倍數為1的電燈,第二個學生拉倍數為2的電燈,…,依此類推。
對於電燈,第一個電燈會被第一個學生拉,第二個電燈會被第一、二個學生拉,第三個電燈會被第一、三個學生拉,…,依此類推,我們可以知道對於每一個電燈的開與關是獨立的,每個電燈編號的因數對應拉它的學生,例如:
第二個電燈,對應因數為1,2,同時對應第一、二個學生
第三個電燈,對應因數為1,3,同時對應第一、三個學生
…
所以思路便是從1~n遍歷燈,迴圈下再求因數的總個數,如果因數總個數為奇數,則亮,反之,則滅。同時記錄亮著的總電燈數。
詳細C++程式碼如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int N;
int lightCount = 0;
cin >> N;
for(int i = 1; i <= N; i++)
{
int count = 0;
for(int j = 1; j <= i; j++) //求每個燈的因數
{
if(i % j == 0)
{
count++; //因數總個數
}
}
if(count % 2 == 1)
{
++lightCount; //為奇則亮
cout << i << " is light" << endl;
}
}
cout << lightCount << endl;
return 0;
}
部分樣例執行結果如下: