声明:这是我个人在看到园子里两篇关于两道面试编程题的帖子后的思考面试题1:大厅里有100盏灯,每盏灯都从1-编号100。每个灯都由一个开关控制。(按一次开关,灯亮,再按一次关灯,开关的数字与控制的灯相同。)开始时,灯全部熄灭。现在按以下规则按下开关。第一次,打开所有的灯。第二次,按下所有2的倍数的开关。第三次,按下所有3的倍数的开关,依此类推。第N次,按下所有N的倍数的开关。第100次按下后,大厅里还有多少盏灯亮着。看到这道题后,我立马想到了如何编程来实现这道题。这道题并不复杂,很快就想到了实现的方法。首先我写了一个winform程序,界面用来显示各个灯的状态*****版本代码如下1234567891011121314151617181920212223242526privatevoidForm1_Load(objectsender,EventArgse){//灯的集合Dictionary<灯的序号,灯的状态(0:关,1:开)>DictionarydicLight=newDictionary();//添加100个灯for(inti=1;i<=100;i++)dicLight.Add(i,0);//对灯进行100次操作for(inti=1;i<=100;i++){if(i==0)//打开所有灯Bright对于(intj=1;j<=100;j++)dicLight[j]=1;elsefor(intk=1;k<=100;k++)if(k%i==0)dicLight[k]=dicLight[k]==1?0:1;}//循环所有的灯并显示在界面上值==0?"关":"开")+"\r\n";}下面是运行的结果那么到此结束了吗?当然不是,然后想到如果灯的数量和操作的次数是可变的,于是开始重构这个方法,将可变参数提取为方法参数修改后的代码如下12345678910111213141516171819202122232425262728293031323334353637383940privatevoidForm1_Load(objectsender,EventArgse){}publicDictionaryChangeLightState(intlightNum,intchangeLightNum){//LightCollectionDictionary<灯的序号,灯的状态(0:关,1:开)>DictionarydicLight=newDictionary();//添加N盏灯for(inti=1;i<=lightNum;i++)dicLight.Add(i,0);//N个灯的操作for(inti=1;i<=changeLightNum;i++){if(i==1)//打开所有灯Brightfor(intj=1;j<=lightNum;j++)dicLight[j]=1;别的对于(intk=1;k<=lightNum;k++)if(k%i==0)dicLight[k]=dicLight[k]==1?0:1;}返回dicLight;}privatevoidbtnStartCal_Click(objectsender,EventArgse){intlightNum=0,changeLightNum=0;int.TryParse(txtLightNum.Text,outlightNum);int.TryParse(txtChangeLightNum.Text,outchangeLightNum);DictionarydicLight=ChangeLightState(lightNum,changeLightNum);//循环所有的灯并显示在界面上=0?"OFF":"明亮")+"\r\n";}下面是运行界面和运行结果。看过《大话设计模式》的同学都知道,这里一定没有尽头。想实现2的倍数3的倍数不亮怎么办?下面就留给大家想象吧。