標籤:style blog color os 代碼 for
中級題:100分
描述:一條長廊裡依次裝有n(1 ≤ n ≤ 65535)盞電燈,從頭到尾編號1、2、3、…n-1、n。每盞電燈由一個拉線開關控制。開始,電燈全部關著。
有n個學生從長廊穿過。第一個學生把號碼凡是1的倍數的電燈的開關拉一下;接著第二個學生把號碼凡是2的倍數的電燈的開關拉一下;接著第三個學生把號碼凡是3的倍數的電燈的開關拉一下;如此繼續下去,最後第n個學生把號碼凡是n的倍數的電燈的開關拉一下。n個學生按此規定走完後,長廊裡電燈有幾盞亮著。註:電燈數和學生數一致。
輸入:電燈的數量
輸出:亮著的電燈數量
範例輸入:3 ,範例輸出:1
解題思路1:這道題,如果要類比的話,當然是可以的,但對於代碼基礎較差的同學寫起來就比較吃力了,在這裡寫類比的做法
解題思路2:在這道題上面多思考思考,可以看出,對於任何一個燈來說,比如12,其因數有1,2,3,4,6,12。說明,編號為1,2,3,4,6,12的學生分別要拉它一下,在這裡發現,1*12=12,2*6=12,3*4=12,所以其因數都是一一對應的,也就是,1拉的那一下被12抵消了,2拉的那一下被6抵消了,那麼誰不會被抵消呢?答案是平方數,比如9的因數是1,3,9,那麼3*3=9,而3隻拉一次,所以不會被抵消。因此,這道題的答案就是,輸入的n以內的平方數個數,等於(int)sqrt(n)。
從這道題可以看出,編程的很多時候,多思考比多動筆要有用的多。
#include<iostream>using namespace std;void main(){ int n; cin>>n; int numLightOn = 0; for(int i=1;(i*i)<=n;i++) numLightOn++; cout<<numLightOn<<endl; }
用類比的方法代碼如下:
#include<iostream>#include<vector>using namespace std;void main(){ int n; cin>>n; vector<int> light(n+1,0);//0表示滅的,1表示亮的 int numLightOn=0; for(int i=1;i<=n;i++)//n個人 { int j=i; int times = 2; while(j<=n) { light[j]= 1-light[j]; // 0->1,1->0 j = i; //第j盞燈 j *= times; times++; } }//end for for(int i=1;i<=n;i++) { if(light[i]==1) numLightOn++; } cout<<numLightOn<<endl; }