`
ftj20003
  • 浏览: 132365 次
  • 性别: Icon_minigender_1
  • 来自: ...
社区版块
存档分类
最新评论

一道位操作的趣味编程题

    博客分类:
  • Java
阅读更多
    看到一道很有意思的编程题:大厅里有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);
	}
}

这个题目解答的巧妙之处就在于使用位操作来变换每一位的状态,非常好的思路。
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    C++趣味编程题(含答案).doc

    《C++趣味编程题》是一份集合了多个有趣编程挑战的文档,主要针对C++语言进行设计。这些题目旨在帮助学习者提升C++编程技能,同时增加编程的乐趣。本题库涵盖不同难度级别的问题,适合不同程度的C++学习者。 在提供...

    c语言趣味编程源代码.rar

    c语言趣味编程源代c语言趣味编程源代c语言趣味编程源代c语言趣味编程源代c语言趣味编程源代c语言趣味编程源代c语言趣味编程源代c语言趣味编程源代c语言趣味编程源代c语言趣味编程源代c语言趣味编程源代c语言趣味编程...

    C++趣味编程100题

    通过分析“C++趣味编程100题”的部分题目,我们了解了C++在图形输出、数学函数应用、控制结构使用以及标准库调用等方面的实践技巧。这些知识不仅有助于提升编程能力,还能激发对C++编程的兴趣,尤其是在解决实际问题...

    python趣味编程100例(99个)

    "Python趣味编程100例(99个)"这个资源显然是为了帮助初学者通过一系列有趣的实践例子来学习Python编程。 在Python编程中,基础是非常重要的。例如,了解变量的声明和使用,数据类型如整型(int)、浮点型(float)、...

    趣味编程题整理与答案.doc

    趣味编程题整理与答案.doc

    小学生C++趣味编程配套教学资源

    《小学生C++趣味编程》以单元和课的形式编排、符合小学生认知特点的编程入门书,知识点依次呈现,深入浅出,循序渐进。课课有习题,课课有课件,易学易会。以知识点为中心,《小学生C++趣味编程》适D地弱化语法,...

    趣味编程挑战从Python入门到AI应用_15.pdf

    趣味编程挑战从Python入门到AI应用_15.pdf趣味编程挑战从Python入门到AI应用_15.pdf趣味编程挑战从Python入门到AI应用_15.pdf趣味编程挑战从Python入门到AI应用_15.pdf趣味编程挑战从Python入门到AI应用_15.pdf趣味...

    小学生C++趣味编程 C++源代码(2021.11.22).rar

    8. **第16课 开灯关灯.cpp**:这个题目可能涉及位操作或数组,模拟灯泡开关的问题,介绍逻辑运算和数组索引。 9. **第59课 韩信点兵 例59.1.cpp**:韩信点兵是中国古代的一个计数问题,这节课可能介绍了递归或模...

    马克思手稿中的趣味数学题

    然而鲜为人知的是,在他的手稿中,竟也隐藏着一道关于趣味数学的题目。这道题目不仅体现了马克思对日常生活的观察,也显示了数学问题在解决实际问题时的魅力。 在马克思的手稿中被发现的数学问题,描述了一个简单而...

    Java趣味编程100例.pdf

    Java趣味编程100例.pdf

    Java趣味编程100例 清华大学出版社.zip

    本书讲解了100个各种类型的Java编程趣味题的求解过程,旨在帮助读者培养编程兴趣,拓宽Java编程思维,提高Java编程能力,掌握用程序设计解决实际问题的方法与技巧。本书取材注重趣味性与实用性,内容涵盖了Java编程...

    趣味程序设计编程/经典趣味编程

    趣味程序设计编程,趣味程序设计编程/经典趣味编程

    第44课 角谷猜想 《小学生C++趣味编程》.pdf

    角谷猜想 C++ 编程实践 角谷猜想是一种数学猜想,指的是对于任何一个正整数n,存在一个正...角谷猜想C++编程实践是《小学生C++趣味编程》中的一节课,旨在帮助学生通过编程来验证角谷猜想,提高编程能力和数学思维。

    《小学生C++趣味编程》 视频集(2024.10.22).pdf

    《小学生C++趣味编程》 视频集(2024.10.22)

    c++趣味编程配套课件

    C++趣味编程是一门引人入胜的课程,旨在帮助初学者理解编程基础,并通过实践探索编程的乐趣。在这个配套课件中,我们将深入探讨C++语言的各个方面,使其成为掌握编程概念的有效工具。 首先,我们要了解C++的基本...

    《小学生C++趣味编程》-C++、Scratch(2023.10.13)G.pdf

    "第16课 开灯关灯"可能与位操作有关,通过开关状态的变化来学习逻辑操作。"第17课 欧耶欧耶"可能是个判断题,让学生编写程序来识别特定的序列。"第18课 闰年与平年"则让孩子们学习如何判断一个年份是否为闰年,涉及...

    《小学生C++趣味编程》-C++、Scratch(2023.10.07)E.pdf

    《小学生C++趣味编程》--C++、Scratch(2023.10.07)E

    青少年趣味编程Python系列课程--2019-09-23.pdf

    标题《青少年趣味编程Python系列课程--2019-09-23》以及描述《青少年趣味编程Python系列课程--2019-09-23》揭示了该文件是一份针对青少年的Python编程课程计划,时间为2019年9月23日。文档的标签为“python学习 系列...

    《小学生C++趣味编程》-C++、Scratch(2023.09.27)E.pdf

    在《小学生C++趣味编程》中,学生将学习到如何使用C++进行基本的编程操作,如变量声明、算术运算、输入输出等。例如,通过计算球的体积,学生可以了解如何运用数学公式和函数来解决问题。 顺序结构是程序设计的基础...

Global site tag (gtag.js) - Google Analytics