最近在网上看见一道面试题,随手做了一下,也作为我开始写博客的第一篇开始。
因为我最近在学习php,所以我就用PHP来解决它,不过天下语言是一家,其他的语言也可参照思想。题目比较简单,如下:
大厅里有100盏灯,每盏灯都编了号码,分别为1-100。每盏灯由一个开关来控制。(开关按一下,灯亮,再按一下灯灭。开关的编号与被控制的灯相同。)开始时,灯是全灭的。现在按照以下规则按动开关。
第一次,将所有的灯点亮。
第二次,将所有2的倍数的开关按一下。
第三次,将所有3的倍数的开关按一下。
以此类推。第N次,将所有N的倍数的开关按一下。
问第100次按完以后,大厅里还有几盏灯是亮的。
方法如 下:
1 <?php 2 3 //totle:总共的灯盏数,times:按动开关的次数 4 function switchLight($totle,$times){ 5 //定义开关打开和关闭的状态属性 6 $on=1; 7 $off=-1; 8 //定义一个按动开关的动作 9 $oc=-1; 10 //建立一个数组,动态存储灯盏数目,并初始化状态 11 $lights=array(); 12 for($i=1;$i<=$totle;$i++){ 13 $lights[$i]=$off; 14 } 15 //判断没有按动开关的情况 16 if($times==0){ 17 return 0; 18 } 19 //循环判断,并按动开关 20 for($j=1;$j<=$times;$j++){ 21 for($k=1;$k<=$totle;$k++){ 22 if(!($k%$j)) 23 $lights[$k]*=$oc; 24 } 25 } 26 //遍历出所有为on的灯,并存入新数组 27 $newLights=array(); 28 for($r=1;$r<=$totle;$r++){ 29 if($lights[$r]==$on){ 30 $newLights[]=$r; 31 } 32 } 33 return $newLights; 34 35 } 36 37 $newLights=switchLight(100,100); 38 echo "结果有".count($newLights)."盏灯亮,具体如下:"; 39 foreach($newLights as $light){ 40 echo $light; 41 echo "\n"; 42 } 43 ?>
有更好的方法,会后续更新。