華為機試(7)

來源:互聯網
上載者:User

標籤: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;    }

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.