从150盏灯这道奥数题说起...... 推荐 原创 jackyBLF 2017-01-09 12:06:27 ©著作权 文章标签 c++ 奥数题 文章分类 C/C++ 后端开发 ©著作权归作者所有:来自51CTO博客作者jackyBLF的原创作品,如需转载,请与作者联系,否则将追究法律责任 前段时间,成都9岁学生纠错奥赛名题这篇文章在网上爆红。本文不关注神童之类的新闻,仅仅从计算机实现的角度来验证题目正确性。题目描述(需求描述):150盏亮着的电灯,各有一个拉线开关控制,按顺序编号为1,2,3,…,150。将编号为3的倍数的灯的拉线各拉一下,再将编号为5的倍数的灯的拉线各拉一下,拉完后亮着的灯数为__盏。使用暴力穷举法来获得正确答案:为了简单期间,我们可以将150盏灯缩小10倍,变为15盏灯,这样就很容易用暴力穷举法来标记出灯的最终结果:答案:第一遍拉灭3的倍数,15÷3=5个第二遍拉灭5的倍数,15÷5=3个重点!!!问题就出在第二遍上,第二遍真的拉灭3个灯吗,不对!!!算出3和5的公倍数有15÷(3×5)=1个,就是说第二次的时候,有1盏(15号)灯是第一次拉灭的,第二次再拉是不是又亮了呢?那么第二次实际上是拉灭了2盏灯(5号灯,10号灯),同时拉亮了1盏(15号灯),那么最后是多少灯亮着呢?15-5-2+1=9盏通过上面的缩小10倍,暴力穷举后,你会发现正确的答案!然后再扩大10,就知道90是正确答案!这道题目,目的是考察公倍数相关知识,只是饶了几个圈。提炼关键点(需求分析)150盏灯,按顺序1-150编号,初始处于亮着的状态,每个灯有两种状态变化:亮/暗(开关变量)。由上面这句话,我们可以提炼出一个数据结构 Light,具有两个关键的属性,具体见下面代码:struct Light { int index; //第一个属性,index表示当前灯的编号 int isOn; //第二个属性,isOn表示当前灯是不是亮着 //构造函数 Light() { index = 0; //初始化时候,编号为0,后面代码会设置到底是哪个编号 isOn = 1; //根据题意,初始化时候,所有灯是属于亮着状态,因此设置为1,表示灯亮着,如果isOn为0,表示灯暗着 } };将编号为3的倍数的灯的拉线各拉一下,再将编号为5的倍数的灯的拉线各拉一下。1) 在计算机代码中,我们如何来表示整除这个概念呢?很简单,用c语系的%符号,该符号表示取模操作(或叫取余操作)。例如: 15%5 = (15-3*5) = 0 表示余数为0,则15被5整除,而15整除5。 15%4 = (15-3*4)=3 表示余数为3,有余数情况下,就没有整除和被正处的概念所以,使用计算机代码表示整除,我们可以使用条件语句加取模操作来表示:int x = 15; //int 是c关键词,表示整数(包括自然数和负数) if((x % 5) == 0) //如果 x%5 的结果为0 { //则说明x能被5整除 //下面就进行结果处理 } else { //否者不能被5整除 //你可以处理不能被5整除的情况,也可以不处理 //如果不处理else状态,那么你可以将else{}这段代码全部不写,就当作什么都不发生 }2) 在计算机代码中,我们如何表示开关状态?两种方式://条件语句,繁琐 int onoff = 1; //0表示关,1表示开,初始化,onoff = 1表示开 //markA: if(onoff == 1) //如果onoff ==1 ,说明是开的情况下 { onoff = 0; //则把他关闭 } else //否则onoff == 0,说明是关的情况 { onoff = 1; //则把他打开 }你会发现使用条件判断方式,很繁琐,而且不高效。这时候我们可以引入c语系的一个经典的操作符^(异或操作)由于开关操作表示的状态就是0(关)/1(开),那么我们很容易使用异或来表示开关int onoff = 1; //0表示关,1表示开,初始化,onoff = 1表示开 onoff ^= 1; // 表示如果Onoff=1,则变为0, 如果Onoff=0,则变为1 //只要这么一句话,就相当于上面的markA下所有条件判断代码,你会发现,真是少写了很多代码,而且相当具有美感有了上面这些基础知识,我们就很容易写出代码来通过计算机程序进行验证代码实现:#define LIGHTCOUNT 150 int main() { //分配150个灯的内存,初始化时候,isOn为true,说明灯是亮着 Light lights[LIGHTCOUNT]; //将150个灯进行编号,index = [1-150] for (int i = 0; i < LIGHTCOUNT; i++) { lights[i].index = i+1; } //遍历150个灯,凡是能被3整除的(%取模操作=0),则将标记变量进行异或操作(x^1表示,如果x为0,则变为1,如果x为1,则变为0,经典的开关变量) for (int i = 0; i < LIGHTCOUNT; i++) { if ((lights[i].index) % 3 == 0) { lights[i].isOn ^= 1; //由于初始化都是亮着,所以能被3整除的灯,异或后,变为关状态 } } //遍历150个灯,凡是能被5整除的(%取模操作=0),则将标记变量进行异或操作(x^1表示,如果x为0,则变为1,如果x为1,则变为0,经典的开关变量) for (int i = 0; i < LIGHTCOUNT; i++) { if ((lights[i].index) % 5 == 0) { lights[i].isOn ^= 1; } } //到上面代码,凡是inOn = 1的,表示灯开着,否者关闭,我们来输出计数器,看看有多少灯是亮着的 int count = 0; //计数器初始化为0个 //遍历150个灯,凡是isOn = 1的话,则计数器加1,并且打印出亮着的灯的索引号以及isOn状态(此时,肯定isOn = 1) for (int i = 0; i < LIGHTCOUNT; i++) { if (lights[i].isOn) { count++; if(count % 3 == 0) printf("亮着的灯的索引号:%03d 状态:%d\n", lights[i].index, lights[i].isOn); else printf("亮着的灯的索引号:%03d 状态:%d ", lights[i].index, lights[i].isOn); } } //最后打印出到底还有多少灯亮着 printf("一共有多少个灯亮呢? 答案是:%d\n", count); getchar(); return 0; }运行一下代码:我们将150盏灯:#define LIGHTCOUNT 150改为15盏灯:#define LIGHTCOUNT 15运行一下代码:由此,我们用c语言验证了这道题目。在这段简单的代码中,涉及了c语言程序的大部分基本核心要素:struct定义了数据结构Light以及两个属性(成员变量)任何程序语言,总归能用三种类型的语句来解决任何编程问题: for ---> 循环语句 if ---> 条件语句 除此之外的语句,称为顺序语句 天道循环,不出这三种语句。上亿行的操作系统,几十行的简单程序,都是由这三种语句组合而成。由此可见,c语言是简单,强大的语言,特别适合三年级及以上的学生学习由:1、例如 struct/for/if/int 等32个固定的关键词 2、3大语句(循环语句,条件语句以及顺序语句) 3、例如 + - * / % > == < ^... 几十个操作符组合而成。c语言绝对是开拓思维的好工具。当思维练习在纸上做的时候, 那叫奥林匹克数学!当思维联系用计算机做的时候, 那叫信息奥林匹克!拿了奥数杯赛好名次,小升初有加分拿了信息奥林匹克,清华北大就直接抢,最后都成了微软,谷歌,facebook的菜。 赞 收藏 评论 分享 举报 上一篇:OpenGL太阳系Demo 下一篇:一笔画探索 提问和评论都可以,用心的回复会被更多人看到 评论 发布评论 全部评论 () 最热 最新 相关文章 【教3妹学编程-算法题】人员站位的方案数 II 2哥 : 3妹,今天第一天上班啊,开工大吉~3妹:2哥,开工大吉鸭,有没有开工红包?2哥 : 我们公司比较扣,估计不会发的。3妹:我们公司估计也一样,不过依然挡不住我打工人的热情!2哥 :哈哈哈哈,公司不给咱发红包,咱们自掏腰包吃顿好的吧,祝愿2024都发大财!3妹:好鸭好鸭,我想吃火锅,红红火火2哥:没问题3妹:听说有的公司,人员站成两排欢迎老板,老板们给发红包2哥:好吧,只要有 二维数组 java代码 i++ 有趣的CSS - 好看的聚光灯效果 使用css实现一个好看的聚光灯效果。 css html 聚光顶 动画 ui FRDM-MCXN947开发板之RGB灯 NXP FRDM-MCXN947开发板之RGB LED驱动 NXP RT-Thread FRDM-MCXN947 RGB 100盏灯 有100盏灯,从1~100编上号,开始时所有的灯都是关着的,第一次,把所有编号是1的倍数的灯的开关状态改变一次;第二次,把所有编号是2的倍数的灯的开关状态改变一次;第三次,把所有编号是3的倍数的灯的开关状态改变一次;以此类推,直到把所有编号是100得倍数的灯的开关状态改变一次。问,此时所有开着的灯的编号package com.yenange.t2; public class Light { &n 100盏灯 按键控制四盏灯 1.button.h#ifndef _BUTTON_H_#define _BUTTON_H_# include //宏定义#define LEDIO口#define uchar unsigned ch #define d3 头文件 我只是一盏灯 我不是天下的太阳,没有永恒的光芒照你辉煌,我只是一盏灯,熬尽心血,伴你一生。真真的目的,不在于达到极限,而在于臻于圆满的境界,那,才是无限的。土壤使树木束缚于土地,作为培植的报酬;天空一无所求。听任树木的自由自在啊!我的爱,像阳光一样,包围着你,而又给你光辉灿烂的自由! 职场 情感 我只是一盏灯 休闲 生命中的三盏灯 生命中的三盏灯 志存高远.人求上者,则居中.人求中者,则居下.人求下者,则无为. 第一盏灯:志存高远。人的一生中,你求上,有可能居中;你求中,则有可能居下;而你若求下,则必定不入流。所以在人生起步的时候,立志必须高远。要学雄鹰展翅飞,不效燕鹊安于栖。只有这样,才能激发你生命的潜能,步步为营,逐渐走向辉煌。   职业 潜能 生命中的三盏灯 人的一生 高远 arduino uno 点亮一盏灯代码 【代码】arduino uno 点亮一盏灯代码。 单片机 嵌入式硬件 引脚 Uno 看李彦宏为创业者点亮四盏灯 小刀马 份额,晋升中国互联网市值第一,李彦宏本人问鼎内地首富……很多上市公司都是创业者慢慢积累起来的,这条路百度走了十年,还有更多怀揣梦想的创业者踌躇满志地谋划着自己的前景。俗话说,偷师学技若伶俐,拙笔焉能炼习颛,虽未必定得到“真传”,但总也能借着些许前人智慧的光芒让眼前路更清晰,而这些灯火,我们不妨从最近李彦宏南开大学的 职场 百度 休闲 李彦宏 STM32点亮第一盏灯 STM32点亮第一盏灯1.在原理图里面找到灯的位置2.编程实现3.编译、连接、下载运行即可1.在原理图里面 STM32第一个程序 STM32亮灯 寄存器 原理图 编程实现 用机智云点亮一盏灯 物联网智能家居 因为是去年申请的博客,第二次写博客,所以这是我在机智云社区写的一篇教程复制了过来。 前些阵子在机智云申请了两块开发板,一个是STM32的底板,另外一块是arduino的底板,先收到的arduino的底板,一直很困扰,除了它自带的程序和功能不会二次开发,后来又收到了机智云stm32板子,其实我是一名大 机智云物联网 二次开发 远程控制 d3 数据 为别人点一盏灯,照亮别人,也照亮了自己 从前有个人,在沙漠中迷失了方向,饥渴难忍,濒临死亡。可他仍然拖着沉重的脚步,一步一步地向前走,终于找到了一间废弃的小屋。这间屋子已久无人住,风吹日晒,破旧不堪。在屋前,他发现了一个吸水器,于是便用力抽水,可滴水全无。他气恼至极。忽然他又发现旁边有一个水壶,壶口被木塞塞住,壶下压着一张纸条,上面写着:“你要先把这壶水灌到吸水器中,然后才能打上水来。但是,在你走之前一定要把水壶装满。”他小心翼翼地打开 java 一片“纸电池”点亮一盏灯 可弯曲可降解 2007.08.15 美国科学家12日宣布,他们已发明出一种纸电池。这种电池分量极轻,可以随意弯曲,并且能够生物降解。 这项研发成果刊登在最新一期《国家科学院学报》月刊上。专家预计,它将在消费电子用品领域引起“轩然大波”。 可以叠成任何形状 科学家研发出的纸电池模型 职场 休闲 企业者的福音之8266接入阿里智能,点亮一盏灯 有在阿里智能注册签订协议的商家,方可开发! 阿里 企业 阿里智能 #define json 【教程】RT-Thread接入机智云,点亮一盏灯(附源码) 本文以gokit为例,阐述RT-Thread接入机智云,创建一个线程,点亮一盏灯。 自动生成 html 微信 二维码 网络编程 脑洞大开的数学:一盏灯如何照亮任何房型的每个角落 12910000 反例 线段相交 点光源 小学数学奥数题 两个齿轮共有18个齿和63个齿 其中某一对指定的齿从第一次相遇到第二次相遇,18个齿的齿轮要转多少周,63个齿的齿轮要转多少周 某个齿从第一次相遇到第二次相遇,则它们转动经过的齿数应是两个齿轮齿数的最小分倍数 甲、乙两人同时从A地出发,以相同的速度向B地前进,甲每行6分钟休息2分钟,乙每行210米休 系统 亮着电灯的盏数 一条长廊里依次装有n(1 ≤ n ≤ 65535)盏电灯,从头到尾编号1、2、3、…n-1、n。每盏电灯由一个拉线开关控制。开始,电灯全部关着。 有n个学生从长廊穿过。第一个学生把号码凡是1的倍数的电灯的开关拉一下;接着第二个学生把号码凡是2的倍数的电灯的开关拉一下;接着第三个学生把号码凡是3的倍数的电灯的开关拉一下;如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下。n个 include count 开关 从猴子说起 有这样一个笑话:一个旅客走进硅谷的一家宠物店,浏览展示的宠物。这时,走进一个顾客,对店主说:"我要买一只C猴。"店主点了点头,走到商店一头的兽笼边,抓出一只猴,递给顾客说:"总共5000美元。"顾客付完款,然后带走了他的猴子。这位旅客非常惊讶,走到店主跟前说:"那只猴子也太贵了!"店主说:"那只猴子能用C编程,非常快,代码紧凑高效,所以值那么多 编程 笑话 java c 面向对象 从福利说起 只不过大家被各种套路营销习惯了,看到真的福利反而不相信了,但是这里我得说一句,B 哥的号几乎每月都有一大批推广合作的,而且合作费用还不便宜,但是即便如此,并不是给钱就能合作,我都是严格筛选、严格审核,觉得靠谱的才会接,为此拒绝过很多,你们说我是跟钱过不去,那真不为过。 搜索 公众号