- 浏览: 130592 次
- 性别:
- 来自: ...
文章分类
最新评论
看到一道很有意思的编程题:大厅里有64盏灯,每盏灯都编了号码,分别为1-64。每盏灯都由一个开关来控制。(开关按一下,灯亮,再按一下灯灭。开关的编号与被控制的灯相同。)开始时,灯是全灭的。现在按照以下规则按动开关。 第一次,将所有的灯点亮。 第二次,将所有2的倍数的开关按一下。 第三次,将所有3 的倍数的开关按一下。以此类推。第N次,将所有N的倍数的开关按一下。 问第N次(N小于等于64)按完以后,大厅里还有几盏灯是亮的。提示可以用long型数字去做,很巧妙刚刚好表示64位,0或者1代表打开或者关闭。写了个实现和原作者的基本思路是一样的:
这个题目解答的巧妙之处就在于使用位操作来变换每一位的状态,非常好的思路。
/** * * @author: yanxuxin * @date: 2010-3-13 */ public class LightSwiter { public static void main(String[] args) { long lights = switchLights(3); convert2Binary(lights); System.out.println(); countOpenedLights(lights); } /** * 切换开关 * * @param sequence * @return */ public static long switchLights(int sequence) { long lights = 0l; //所有的都是关闭的状态,即64位均为0 for (int i = 1; i <= sequence; i++) { for (int j = 1; j <= 64; j++) { if (j % i == 0) { //符合第n次的倍数 long temp = 1l; temp = temp << (j - 1); //准备截取当前位 if ((lights & temp) == 0) { //表明lights的当前位为0,即关闭状态 lights = lights | temp; //不影响其他位数的情况下,改变lights的当前位的状态为1 } else { temp = ~temp; lights = lights & temp; //不影响其他位数的情况下,改变lights的当前位的状态为0 } } } } return lights; } /** * 统计点亮的灯数 * * @param lights */ public static void countOpenedLights(long lights) { int remains = 0; for (int k = 0; k < 64; k++) { long temp = 1l; temp = temp << k; temp = (lights & temp); //截取当前位判断 if (temp != 0) { remains++; System.out.println("The " + (k + 1) + " light is opened."); } } System.out.println("Total " + remains + " lights are opened."); } /** * 转化成二进制的表达式显示 * * @param number */ public static void convert2Binary(long number) { long res = number / 2; long rem = number % 2; if (res != 0) { convert2Binary(res); } System.out.print(rem); } }
这个题目解答的巧妙之处就在于使用位操作来变换每一位的状态,非常好的思路。
发表评论
文章已被作者锁定,不允许评论。
-
一道字符串截取的编程题
2010-03-11 10:52 2277最近接触到一道字符串截取的编程题:编写一个截取字符串的 ... -
一道多线程趣味热身题
2010-02-28 18:01 1916保持对知识点或者技术的熟悉度对于程序员至关重要,要学会 ... -
疑似Google多线程面试题的Java实现
2010-02-24 17:39 4907来到一个完全陌生的地方,即将一切从新开始,内心兴奋又忐 ... -
Mina的线程池实现分析(2)
2010-02-10 17:31 4522分析了I/O事件的存储,下面看看多个Worker同时工 ... -
Mina的线程池实现分析(1)
2010-02-10 17:28 11575线程池是并发应用中,为了减少每个任务调用的开销增强性能 ... -
多线程基础总结十一--ConcurrentLinkedQueue
2010-02-03 17:52 12840ConcurrentLinkedQueue充分使用了a ... -
LinkedBlockingQueue应用--生产消费模型简单实现
2010-01-29 20:45 8137之前介绍时LinkedBlockingQueue提到了 ... -
多线程基础总结十--LinkedBlockingQueue
2010-01-28 14:33 15372随着多线程基础总结的增多,却明显的感觉知道的越来越少, ... -
号称放倒一片的一道J2SE基础题的个人理解
2010-01-23 14:07 2793近日无意中看到一道Java基础题,号称在接受测试的10 ... -
多线程基础总结九--Mina窥探(1)
2010-01-21 23:46 5401一直以来的多线程的基础总结都是脱离应用的,但是要说多线 ... -
多线程基础总结八--ReentrantReadWriteLock
2010-01-15 23:22 7510说到ReentrantReadWriteLock,首先 ... -
多线程基础总结七--ReentrantLock
2010-01-09 23:17 7678之前总结了部分无锁机制的多线程基础,理想的状态当然是利 ... -
关于atomic问题的一点理解
2009-12-30 16:42 2440之前看到一个帖子是关于atomic使用的,当时没有仔细 ... -
多线程基础总结六--synchronized(2)
2009-12-18 18:45 1870早在总结一时,我就尽量的把synchronized的重点 ... -
多线程基础总结五--atomic
2009-12-17 19:46 3551在简单介绍java.util.c ... -
多线程基础总结四--ThreadLocal
2009-12-16 19:48 2719说到ThreadLocal,首先 ... -
多线程基础总结三--volatile
2009-12-15 20:09 2525前面的两篇总结简 ... -
多线程基础总结二--Thread
2009-12-12 23:27 2668对于Thread来说 ... -
多线程基础总结一--synchronized(1)
2009-12-12 23:23 3068最近写关于并发的小应 ... -
由destory-method引发的IOC容器设计的思考
2009-12-07 16:51 1682第一次读Spring的源 ...
相关推荐
一套c++的趣味编程题合集
本人整理的C++趣味编程100题,包括解答
python少⼉趣味编程视频教程全套-Python少⼉趣味编程 Python简单易学,功能强⼤,是少⼉学习编程的⾸选语⾔。本书是少⼉学习Python编程的趣味指南,全书共17章,按照由简到难、逐步 深⼊的⽅式组织各章内容。本书从...
python如今很流行,AI的首选工具;python趣味编程100例(99个),学习编程不枯燥。
2020小学SCRATCH趣味编程试题.pdf
趣味编程题整理与答案.doc
《小学生C++趣味编程》以单元和课的形式编排、符合小学生认知特点的编程入门书,知识点依次呈现,深入浅出,循序渐进。课课有习题,课课有课件,易学易会。以知识点为中心,《小学生C++趣味编程》适D地弱化语法,...
这是第一辑,而且是别人的东西,大家先看着; 过n天,我再上传c++版的趣味教程
趣味编程挑战从Python入门到AI应用_15.pdf趣味编程挑战从Python入门到AI应用_15.pdf趣味编程挑战从Python入门到AI应用_15.pdf趣味编程挑战从Python入门到AI应用_15.pdf趣味编程挑战从Python入门到AI应用_15.pdf趣味...
Java趣味编程100例.pdf
趣味编程社团活动方案活动计划.pdf趣味编程社团活动方案活动计划.pdf趣味编程社团活动方案活动计划.pdf趣味编程社团活动方案活动计划.pdf趣味编程社团活动方案活动计划.pdf趣味编程社团活动方案活动计划.pdf
本书讲解了100个各种类型的Java编程趣味题的求解过程,旨在帮助读者培养编程兴趣,拓宽Java编程思维,提高Java编程能力,掌握用程序设计解决实际问题的方法与技巧。本书取材注重趣味性与实用性,内容涵盖了Java编程...
趣味程序设计编程,趣味程序设计编程/经典趣味编程
青少年趣味编程Python系列课程--2019-09-23 青少年趣味编程Python系列课程--2019-09-23
马克思手稿中的趣味数学题 马克思⼿稿中有⼀道趣味数学问题:有30个⼈,其中有男⼈、⼥⼈和⼩孩,在⼀家饭馆吃饭花了50先令;每个男⼈花3先令,每个⼥⼈花2先令,每个⼩孩花1先令; 问男⼈、⼥⼈和⼩孩各有⼏⼈? ...
c++趣味编程配套课件,仅供学习分享和交流,免去大家重新寻找网站下载的烦恼。
c语言趣味编程源代c语言趣味编程源代c语言趣味编程源代c语言趣味编程源代c语言趣味编程源代c语言趣味编程源代c语言趣味编程源代c语言趣味编程源代c语言趣味编程源代c语言趣味编程源代c语言趣味编程源代c语言趣味编程...
Java趣味编程100例.docx
很实用的java趣味编程小程序,练练手吧,可以加强自己编程能力
小学生C++趣味编程 C++源代码(2021.11.22).rar