現在有100個標記過的電燈泡。第一個人經過這些燈時,點亮所有的燈,第二個人經過時每隔一盞燈就切換開關一次,第三個人經過時每隔兩盞燈切換開關一次。請問,當第100個人經過時,還剩多少盞亮着的燈?

偶然看到騰訊一個報道《15道燒糊大腦的蘋果面試題》,裏面有些很好算法題,就自己動手寫了一下,尋求點樂趣。

出處URL:http://tech.qq.com/a/20120611/000062.htm#p=8

public class AppleDemo00 {

	/**
	 * @author 州偉
	 * @param args
	 * 現在有100個標記過的電燈泡。第一個人經過這些燈時,點亮所有的燈,第二個人經過時每隔一盞燈就切換開關一次,
	 * 第三個人經過時每隔兩盞燈切換開關一次。
	 * 請問,當第100個人經過時,還剩多少盞亮着的燈?
	 */
	public static void main(String[] args) {
		//初始化一個數組 ,數組元素 0:關燈、1:開燈
		int[] preLights = new int[100];	//初始化元素都爲0,默認關燈
		for(int a : preLights){
			System.out.print(a + " ");
		}

		for(int i=1;i<=100;i++){	//100個人
			for(int j=0;j<100;j=j+i){	//
				if(j==0 && i==1){	//第一個人路過時,第一站燈
					preLights[j] = turnOnorOffLight(preLights[j]);
				}else{
					if(j>1){
						preLights[j-1] = turnOnorOffLight(preLights[j-1]);
					}
					
				}
				
			}
		}
		System.out.println();
		System.out.println("輸出------------------");
		//輸出
		for(int a : preLights){
			System.out.print(a + " ");
		}
		
		//輸出描述
		System.out.println();
		for(int i=0;i<100;i++){
			if(preLights[i] != 0){
				System.out.print(i+1 + ", ");
			}
		}
		System.out.println();
		//發現:結果是完全平方數
		System.out.println("綜上發現:結果是完全平方數:1*1,2*2,3*3,4*4,5*5,6*6,7*7,8*8,9*9,是否有更好的算法呢???");
	}
	
	
	private static int turnOnorOffLight(int a){
		switch (a) {
		case 0:
			return 1;
		case 1:
			return 0;
		}
		return -1;
	}
	
}

輸出結果:

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
輸出------------------
1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
1, 4, 9, 16, 25, 36, 49, 64, 81, 
綜上發現:結果是完全平方數:1*1,2*2,3*3,4*4,5*5,6*6,7*7,8*8,9*9,是否有更好的算法呢(看補充)!

 

希望大家有更好的算法,提供些思路,共同進步。

+奮鬥
補充:謝謝大家的回覆,讓我收益頗多,下面我做了些總結:

做了一個草圖:10(縱10人)X10(橫10棧燈)


第一個人:1 1 1 1 1 1 1 1 1 1
第二個人:0 1 0 1 0 1 0 1 0 1
第三個人:0 0 1 0 0 1 0 0 1 0
第四個人:0 0 0 1 0 0 0 1 0 0
第五個人:0 0 0 0 1 0 0 0 0 1
第六個人:0 0 0 0 0 1 0 0 0 0
第七個人:0 0 0 0 0 0 1 0 0 0
第八個人:0 0 0 0 0 0 0 1 0 0
第九個人:0 0 0 0 0 0 0 0 1 0
第十個人:0 0 0 0 0 0 0 0 0 1
 

從上面的片段中我們看到,第一盞燈:1,第二盞燈:1、2 第三盞燈:1、3 第四盞燈:1、2、4 第五盞燈:1、5 第六盞燈:1、2、3、6 第七盞燈:1、7 第八盞燈:1、2、4、8 第九盞燈:1、3、9 第四盞燈:1、2、5、10  略。

綜上:相信大家已經看出來了:

凡是最後亮的燈,都被按過奇數次每盞燈被按的次數,即等於它的約數的個數,比如8號燈,它被第1、2、4、8這四個人按到,所以最後是滅的狀態,再比如16號燈,它被第1、2、4、8、16這五個人按到,所以最後是開的狀態。
結論:最後,只有完全平方數,其約數個數爲奇數,就是亮燈的情況。

 

這其實就是純粹的數學問題,沒有必要用code去實現了。

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章