n盏灯亮灭问题
前几天看了华为的一个上机操作题,讲得是n盏灯亮灭问题,本质上还是数学问题,感觉很有趣,和大家分享一下,问题描述如下:
有n盏灯排成一排,依次标号1,2,…,n,每盏灯都有一根拉线开关,最初电灯都是关着的.现有n个人,都沿着电灯路线走过,第一个人走过时,把凡是号码是1的倍数的灯的开关拉一下;接着第二个人走过时,把凡是号码是2的倍数的灯的开关拉一下;第三个走过时,把凡是号码是3的倍数的灯的开关拉一下;…;最后,第n个人走过时,把最后那盏灯的开关拉一下,问:最后有几盏灯是亮着的?
这个问题本质是求某一整数的因数个数的奇偶性问题,因数个数为偶数的标号为n的灯最终灭,因数个数为奇数的标号为n的灯最终亮,回忆我们学过的数学知识,只有完全平方数的因数的个数才是奇数,例如4,9,16........
当时我的第一想法是设置一个空间大小为n的数组,里面依次存储1—n每个数的因数的个数,然后循环判断这个数组中奇数的个数,从而计算出最后的结果,代码就不贴了。后来在网上看到了另一种解法,这种解法中是建立一个bool组,设开始每盏灯都是灭的,每有一个因数就执行开或者关操作,也就是非操作,最后统计下bool组中有多少个是0的,就是亮灯的盏数。这个解法很好的,计算量比我的第一想法要省很多。可见代码是可以逐步优化的。代码如下:
#include<iostream> using namespace std; int main() { ]; ,i; cin>>n; ;i<=n;i++) { for(int j=i;j<=n;j++) { ) form[j]=!form[j]; } } ;i<=n;i++) { ) count++; } cout<<"有 "<<count<<" 盏灯是亮着的。"<<endl; ; }
其实经过我们最上面的分析,只要找出N内所有的完全平方数,算出个数就可以了,可以一步到位啊,省事又省心。如下的小程序:
#include <iostream> #include<math.h> using namespace std; int main() { ,n; double i; cin>>n; ;i<=n;i++) { if(int(sqrt(i))==sqrt(i)) count=count+; } cout<<count<<endl; ; }
从这道题的解法可以看出来,算法可以一步步优化,代码也可以一步一步改进的。
n盏灯亮灭问题的更多相关文章
- 单片机与android手机通信(控制LED小灯亮灭)
1.单片机实验板功能设计 为验证数据通信内容,让单片机板上的四个按键与android手机客户端上的四个LED灯相互控制:为达到上述基本实验要求,采用单字符传输数据即可,硬件需设计两块相同的单片机电路板 ...
- CC2530学习路线-基础实验-GPIO 控制LED灯亮灭(1)
目录 1.前期预备知识 1.1 新大陆ZigBee模块LED灯电路 1.2 CC2530相关寄存器 1.3 寄存器操作技巧 1.4 CPU空转延时 1.4 操作流程图 2.程序代码 The End 1 ...
- CC2530学习路线-基础实验-GPIO 按键控制LED灯亮灭(2)
目录 1.前期预备知识 1.1 新大陆Zigbee模块按键电路图 1.2 CC2530相关寄存器 1.3 CC2530中断走向图 1.4 使用C语言为51单片机编写中断程序 1.5 *函数指针 2. ...
- CC2530学习路线-基础实验-定时器控制LED灯亮灭(3)
目录 1. 前期预备知识 1.1 定时器中断触发 1.2 相关寄存器 1.3 寄存器相关问题 1.4 T1.T3定时器初始化流程 2 程序及代码 THE END 1. 前期预备知识 1.1 定时器中断 ...
- 10-ESP8266 SDK开发基础入门篇--上位机通过串口控制ESP8266灯亮灭
https://www.cnblogs.com/yangfengwu/p/11087618.html 其实这一节就是对上三节的综合测试 https://www.cnblogs.com/yangfeng ...
- (三)开关检测来控制LED灯的亮灭
开关检测案例一: 具体电路图如下: K1--K4闭合,控制 D1—D4 亮灭 产生的问题: 1.关于 R8 R9 R7 R10 的阻值选择问题,倘若太大的话, 比如10K 不管开关断开还是闭合,好像 ...
- K1 K2作为中断源控制红色LED灯,实现任意键按一下LED灯亮或者灭
#include "stm32f10x.h" // 相当于51单片机中的 #include <reg51.h> #include "stm32f10x_gpi ...
- 通过按键实现LED灯的亮灭(含两种情况)
#include "stm32f10x.h"// 相当于51单片机中的 #include <reg51.h> #include "stm32f10x_gpio ...
- 6-51单片机ESP8266学习-AT指令(8266TCP服务器--做自己的AndroidTCP客户端发信息给单片机控制小灯的亮灭)
http://www.cnblogs.com/yangfengwu/p/8776712.html 先把源码和资料链接放到这里 链接: https://pan.baidu.com/s/1jpHZjW_7 ...
随机推荐
- SQL Server如何截断(Truncate)和收缩(Shrink)事务日志
当SQL Server截断事务日志时,它仅仅是在虚拟日志文件中做个标记,以便不再使用它,然后准备以重用形式来做备份(假如运载在完整或是批量日志恢复模型).也就是说,在使用简单恢复模型时,事务日志包括如 ...
- C预处理器
C预处理器 目录 概述 文件包含 宏替换 条件包含 概述 预处理器是编译过程中单独执行的第一个步骤 文件包含 #include "文件名" / #include <文件名&g ...
- MySQL中部分系统变量介绍
have_symlink DISABLED YES 用以支持在表定义中指 ...
- php对比辨析之 mysql_escape_string & mysql_real_escape_string & addsalshes
概述: addslashes和mysql_real_escape_string.都是为了使数据安全的插入到数据库中而进行过滤. addslashes 转义的字符是单引号(').双引号("). ...
- ganglia安装-yum
centos6.6 x64 root用户 单机一台,集群中需要监控的安装客户端就可以了 Ganglia是UC Berkeley发起的一个开源集群监视项目,设计用于测量数以千计的节点.Ganglia的核 ...
- C. Mobile phones
Suppose that the fourth generation mobile phone base stations in the Tampere area operate as follows ...
- python--Subprocess模块
The subprocess module allows you to spawn new processes, connect to their input/output/error pipes, ...
- iOS UIImage DownLoad图片的下载缓存全部在此
iOS图片的下载缓存全部在此 分类: iOS编程 -- : 2075人阅读 评论() 收藏 举报 注意: 我的文章只写给自己看 ------------------------------------ ...
- dfa最小化,终于完成了。
采取的方法是hopcroft的填表法,详情见如下代码 #include "nfa_to_dfa.h" int* dfa_diff_matrix; int mini_dfa_numb ...
- 剑指Offer29 连续子数组最大和
/************************************************************************* > File Name: 29_Greate ...