1. 程式人生 > >一道邏輯題 房間裡有100盞電燈

一道邏輯題 房間裡有100盞電燈

部落格園看到的這個問題,也想做一下。題目是這樣的

房間裡有100盞電燈,編號為1,2,3……100,每盞燈上有一個按鈕,初始時燈全都是關的。編好號的100位同學由房間外依次走進去,將自己編號的倍數的燈的按鈕全部按一次,例如第一位同學把編號是1的倍數的燈的按鈕按一下(此時100盞燈全亮),第二位同學把編號是2的倍數的燈的按鈕按一下(此時只有50盞燈亮著,50盞被這個人按滅了)……第100位同學把編號是100的倍數的燈(即編號為100的燈)的按鈕按一下,請問依次走完後,還有多少盞燈亮著?

最簡單的做法就是模擬一下100個同學進入房間的情景,從1號同學開始每個人都去按一遍開關,最後看一下哪些燈亮著,這個方法最簡單也最容易想到,可是效率有點低。其實可以計算一下每個開關被按下的次數,因為剛開始的時候所有的燈泡都是關著的,所以如果某個燈泡的開關被按了奇數次,那麼這個燈泡最終就是開著的,否則就是關著的。那怎麼計算每個燈泡開關被按下的次數呢?因為每個同學都會按下自己編號倍數的開關,即如果燈泡編號是同學編號的倍數,他就會按下開關,也就是說如果同學編號是燈泡編號的約數,他就會按下開關(這不是廢話麼)。那麼統計一下燈泡編號約數的個數就可以了,約數個數為計數的燈泡最後開著,約數個數為偶數的燈泡最後關著。下邊是程式碼:

public class Lamp {
    public static void main(String[] args){
        int result = 0;
        for(int i=1;i<=100;i++){
            if(isOdd(getFactorNum(i))){
                result += 1;
            }
        }
        System.out.println(result);
    }
    //求n約數的個數
    public static int getFactorNum(int n){
        int result = 0;
        for(int i=1;i<=n;i++){
            if(n%i == 0){
                result += 1;
            }
        }
        return result;
    }
    //判斷n是否為奇數
    public static boolean isOdd(int n){
        return (n&1) == 1;
    }
}


--------------------------------更新------------------------------


又想了一下還有更簡單的演算法,因為一個數的約數都成成對出現的,也就是說如果n存在一個約數p,那麼一定有一個q與之相對應且滿足n=pq,所以n約數的個數一定是偶數,但是有一種情況例外,那就是p=q,所以只有編號為完全平方數的燈泡亮著。按著這個方法計算就簡單多了,直接return (int)Math.sqrt(100);

相關推薦

一道邏輯 房間100電燈

在部落格園看到的這個問題,也想做一下。題目是這樣的 房間裡有100盞電燈,編號為1,2,3……100,每盞燈上有一個按鈕,初始時燈全都是關的。編好號的100位同學由房間外依次走進去,將自己編號的倍數的燈的按鈕全部按一次,例如第一位同學把編號是1的倍數的燈的按鈕按一下(此時1

Interview Q&A - 房間燈,屋裡三個開關分別控制這三燈。如何只進入房間一次就知道哪一個開關控制哪一燈?

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

《遊戲王》中的一道邏輯

某年某月某日,看《遊戲王 》,其中提到一個題目,覺得頗有意思,拿出來說給同事聽,不想此題還頗有難度。 題目是這樣的:有兩個相鄰村子,一個是老實村,一個是撒謊村,老實村的人都說實話,撒謊村的人都說謊話,路人甲要去老實村,但他並不知道路怎麼走,在三岔路口,遇到了村民乙(乙肯定是老

邏輯式程式語言極簡實現(使用C#) - 2. 一道邏輯:誰是凶手

本系列前面的文章: * [邏輯式程式語言極簡實現(使用C#) - 1. 邏輯式程式語言介紹](https://www.cnblogs.com/skabyy/p/13199800.html) 這是一道Prolog經典的練習題,中文翻譯版來自阮一峰的文章[《Prolog 語言入門教程》](https://ww

(一道模板) 無源匯上下界可行流

edi block html else printf ack 分類 tex long long 題目描述 這是一道模板題。 n 個點,m 條邊,每條邊 e 有一個流量下界 lower(e) 和流量上界 upper(e),求一種可行方案使得在所

一道經典面試邏輯的python解法

前言: 好早之前看到的一個邏輯題:有兩個2到99之間的整數,a知道這兩個數的和,b知道這兩個數的積。 第一句:a對b說:我不知道這兩個數是多少,但我確信你也不知道。 第二句:b說:我知道了。 第三句:a說:我也知道了。 問這兩個數是多少? 題不難,只是手動去找沒

知乎問題"房間100個人,每人1000元,他們玩一個遊戲,每輪遊戲中,每個人拿出1元,隨機給另一個人,最後他們的財富分佈是怎樣的"實踐解答

知乎上有個有趣的問題,房間裡100個人,每人1000元,他們玩一個遊戲,每輪遊戲中,每個人拿出1元,隨機給另一個人,最後他們的財富分佈是怎樣的? 朋友圈有轉文章《用資料分析告訴你這個世界》分析,可以負債的情況下,17000次後,接近冪律分佈。 驗證如下,結論就是該文章在資

一道

tin res += tint cal 簡化 rgs ret turn 題目:計算13+23+33+……+(n-1)3+n3. 這個式子一般的解法,應當是用循環的方式:先算13,再算23,相加,再算33,相加……算出結果。 1 import java.util.Scan

每天一道Java[1]

就會 p s 提高 清除 轉儲 處理 攻擊 大神 如何使用 問題:char[]與String相比,有什麽優勝的地方? 回答: 針對安全保密高的信息,char[]比String做得更好。因為String是不可變得,即使你修改原先的變量,實際上也是在內存中新建一個對

每天一道Java[6]

parse -m 每天 t對象 logs 父類 stringbu ont text 題目 String字符串怎麽轉換為Date,Date又怎麽轉換成String字符串 解答 String->Date 主要用到類SimpleDateFormat

每天一道Java[7]

java 什麽是 我們 present 使用 指定 以及 let app 題目 什麽是REST原則,請解釋RESTful架構,以及其設計思想? 解答 REST,全稱為Representation State Transfer,是一種互聯網軟件的架構原則

一道CTF引發的思考-MySQL的幾個特性(續)

get 是否 區分 sql sel admin database pan blog 0x00 背景   這兩天處於轉牛角尖的狀態,非常不好。但是上一篇的中提到的問題總算是總結了些東西。 傳送門:疑問點0x02(4) 0x01 測試過程 (1)測試環境情況:創建了如下測試

每天一道Java[9]

public interface jvm image 外部 .cn c代碼 bsp 底層 題目 native關鍵字的作用是什麽? 解答 首先,需了解JNI(Java Native Interface),它是連接Java平臺與本地C代碼的一個API。 其次,

每天一道Java[11]

解答 huang 同步鎖 每次 都是 對象 問題 不能 color 題目 synchronized怎麽實現線程同步?請修改《每天一道Java題[10]》中的MyRunnableThread類以解決三個線程都獲取到10的問題。 解答 方法一: 采用synchro

有趣的邏輯

正常 藥物 blog 邏輯 宋體 到你 ack 自己 nbsp 1、A、B兩人分別在兩座島上。B生病了,A有B所需要的藥。C有一艘小船和一個可以上鎖的箱子。C願意在A和B之間運東西,但東西只能放在箱子裏。只要箱子沒被上鎖,C都會偷走箱子裏的東西,不管箱子裏有什麽。如果A和B

學習筆記:邏輯運算符也優先級區別

php 運算符 優先級 and or不嘗試還真不知道,居然是因為優先級的差別導致,如果是真實編程中遇到,排錯就很困難了,幸虧這裏看到了:$a = true; //聲明一個布爾型變量$a,賦值為真 $b = true; //聲明一個布爾型變量$b,賦值為真 $c

hdu2094—看似拓撲實際上是一道思維

pan blog space acm insert hdu2094 == sin typedef HDU2094 產生冠軍 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=2094 題意:中文題,就不解釋了。題意已經非常清楚了

一道leetcode的收獲如何比較字符串的大小重寫sort中的compare[](string &s,string &t){return s+t>t+s};

etc ++ ansi 匿名 gin leet clas size_t first KEY:一種很好的想法,寫法也很好,使用for(auto i:num)遍歷訪問num lambda表達式重寫比較compare參數,相當完美 while處理[0,0,0]情況的輸出。優雅的解

洛谷P3929 SAC E#1 - 一道 Sequence1【枚舉】

fin 中一 pla 數列 但是 n) def show clas 題目描述 小強很喜歡數列。有一天,他心血來潮,寫下了一個數列。 阿米巴也很喜歡數列。但是他只喜歡其中一種:波動數列。 一個長度為n的波動數列滿足對於任何i(1 <= i < n),均有:

【洛谷P3930】SAC E#1 - 一道大水 Knight

輸入 告訴 com space count es2017 所在 false .... 題目背景 毒奶色和F91是好朋友。 題目描述 他們經常在一起玩一個遊戲,不,不是星際爭霸,是國際象棋。 毒奶色覺得F91是一只雞。他在一個n×n的棋盤上用黑色的城堡(車)、騎士(馬)、主教