1. 程式人生 > 其它 >面試題:亮著電燈的盞數

面試題:亮著電燈的盞數

技術標籤:面試題面試c++程式人生因數演算法

每日刷題(八十五)

題目描述

一條長廊裡依次裝有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; }

部分樣例執行結果如下:
在這裡插入圖片描述
在這裡插入圖片描述

之後我會持續更新,如果喜歡我的文章,請記得一鍵三連哦,點贊關注收藏,你的每一個贊每一份關注每一次收藏都將是我前進路上的無限動力 !!!↖(▔▽▔)↗感謝支援!