前几天看了华为的一个上机操作题,讲得是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盏灯亮灭问题的更多相关文章

  1. 单片机与android手机通信(控制LED小灯亮灭)

    1.单片机实验板功能设计 为验证数据通信内容,让单片机板上的四个按键与android手机客户端上的四个LED灯相互控制:为达到上述基本实验要求,采用单字符传输数据即可,硬件需设计两块相同的单片机电路板 ...

  2. CC2530学习路线-基础实验-GPIO 控制LED灯亮灭(1)

    目录 1.前期预备知识 1.1 新大陆ZigBee模块LED灯电路 1.2 CC2530相关寄存器 1.3 寄存器操作技巧 1.4 CPU空转延时 1.4 操作流程图 2.程序代码 The End 1 ...

  3. CC2530学习路线-基础实验-GPIO 按键控制LED灯亮灭(2)

    目录 1.前期预备知识 1.1 新大陆Zigbee模块按键电路图 1.2 CC2530相关寄存器 1.3 CC2530中断走向图 1.4 使用C语言为51单片机编写中断程序 1.5 *函数指针 2. ...

  4. CC2530学习路线-基础实验-定时器控制LED灯亮灭(3)

    目录 1. 前期预备知识 1.1 定时器中断触发 1.2 相关寄存器 1.3 寄存器相关问题 1.4 T1.T3定时器初始化流程 2 程序及代码 THE END 1. 前期预备知识 1.1 定时器中断 ...

  5. 10-ESP8266 SDK开发基础入门篇--上位机通过串口控制ESP8266灯亮灭

    https://www.cnblogs.com/yangfengwu/p/11087618.html 其实这一节就是对上三节的综合测试 https://www.cnblogs.com/yangfeng ...

  6. (三)开关检测来控制LED灯的亮灭

    开关检测案例一: 具体电路图如下: K1--K4闭合,控制 D1—D4 亮灭 产生的问题: 1.关于 R8 R9 R7 R10 的阻值选择问题,倘若太大的话,  比如10K 不管开关断开还是闭合,好像 ...

  7. K1 K2作为中断源控制红色LED灯,实现任意键按一下LED灯亮或者灭

    #include "stm32f10x.h" // 相当于51单片机中的 #include <reg51.h> #include "stm32f10x_gpi ...

  8. 通过按键实现LED灯的亮灭(含两种情况)

    #include "stm32f10x.h"// 相当于51单片机中的 #include <reg51.h> #include "stm32f10x_gpio ...

  9. 6-51单片机ESP8266学习-AT指令(8266TCP服务器--做自己的AndroidTCP客户端发信息给单片机控制小灯的亮灭)

    http://www.cnblogs.com/yangfengwu/p/8776712.html 先把源码和资料链接放到这里 链接: https://pan.baidu.com/s/1jpHZjW_7 ...

随机推荐

  1. SQL Server如何截断(Truncate)和收缩(Shrink)事务日志

    当SQL Server截断事务日志时,它仅仅是在虚拟日志文件中做个标记,以便不再使用它,然后准备以重用形式来做备份(假如运载在完整或是批量日志恢复模型).也就是说,在使用简单恢复模型时,事务日志包括如 ...

  2. C预处理器

    C预处理器 目录 概述 文件包含 宏替换 条件包含 概述 预处理器是编译过程中单独执行的第一个步骤 文件包含 #include "文件名" / #include <文件名&g ...

  3. MySQL中部分系统变量介绍

      have_symlink                             DISABLED                                   YES 用以支持在表定义中指 ...

  4. php对比辨析之 mysql_escape_string & mysql_real_escape_string & addsalshes

    概述: addslashes和mysql_real_escape_string.都是为了使数据安全的插入到数据库中而进行过滤. addslashes 转义的字符是单引号(').双引号("). ...

  5. ganglia安装-yum

    centos6.6 x64 root用户 单机一台,集群中需要监控的安装客户端就可以了 Ganglia是UC Berkeley发起的一个开源集群监视项目,设计用于测量数以千计的节点.Ganglia的核 ...

  6. C. Mobile phones

    Suppose that the fourth generation mobile phone base stations in the Tampere area operate as follows ...

  7. python--Subprocess模块

    The subprocess module allows you to spawn new processes, connect to their input/output/error pipes, ...

  8. iOS UIImage DownLoad图片的下载缓存全部在此

    iOS图片的下载缓存全部在此 分类: iOS编程 -- : 2075人阅读 评论() 收藏 举报 注意: 我的文章只写给自己看 ------------------------------------ ...

  9. dfa最小化,终于完成了。

    采取的方法是hopcroft的填表法,详情见如下代码 #include "nfa_to_dfa.h" int* dfa_diff_matrix; int mini_dfa_numb ...

  10. 剑指Offer29 连续子数组最大和

    /************************************************************************* > File Name: 29_Greate ...