开灯关灯问题

简介: 来源:http://www.cnblogs.com/haolujun/archive/2012/10/10/2719031.html 作者:haolujun 有编号1~100个灯泡,起初所有的灯都是灭的。

来源:http://www.cnblogs.com/haolujun/archive/2012/10/10/2719031.html

作者:haolujun

有编号1~100个灯泡,起初所有的灯都是灭的。有100个同学来按灯泡开关,如果灯是亮的,那么按过开关之后,灯会灭掉。如果灯是灭的,按过开关之后灯会亮。

现在开始按开关。

第1个同学,把所有的灯泡开关都按一次(按开关灯的编号: 1,2,3,......100)。
第2个同学,隔一个灯按一次(按开关灯的编号: 2,4,6,......,100)。
第3个同学,隔两个灯按一次(按开关灯的编号: 3,6,9,......,99)。
......

问题是,在第100个同学按过之后,有多少盏灯是亮着的?

这个问题有一个数学上的解决方法。可以看出,被按了奇数次的灯泡应该是亮着的,被按了偶数次的灯泡应该是灭的。那么什么样的灯泡被按了奇数次?什么 样的灯泡又被按了偶数次呢?从按的过程可以发现,如果一个灯泡的编号具有偶数个因子,那么该灯泡就被按了偶数次,反之按了奇数次。现在的问题又变成,什么 样的编号具有奇数个因子,什么样的编号具有偶数个因子?这涉及到一个叫做质因数分解的定理,大概的意思是说,任何正数都能被唯一表示成多个质因数幂次乘积 的方式。

例如:

14=2*7
50=2*5^2
...
100=2^2*5^2

也就是N=(p[1]^e[1])*(p[2]^e[2])*......*(p[k]^e[k]),其中p[i]是质数,e[i]是p[i]的幂次。而由这个公式我们又可以导出一个数有多少个因子的计算公式:FactorNumber(N)=(e[1]+1)*(e[2]+1)*......*(e[k]+1)。

那么什么条件下满足FactorNumber(N)是奇数呢?显然必须所有的e[1],e[2],......,e[k]都必须是偶数,这样才能保证e[i]+1是奇数,结果乘积才能是奇数。而由于e[1],e[2],......,e[k]都是偶数,那么N一定是一个完全平方数(因为sqrt(N)=(p[1]^(e[1]/2))*(p[2]^(e[2]/2))*......*(p[k]^(e[k]/2))是整数) 。回到按灯泡的问题上来,1~100中完全平方数有1,4,9,16,25,36,49,64,81,100这10个数,也就是说最后只有编号为这10个数的灯是亮着的。

 

 

 

相类似题目:http://blog.csdn.net/oceaniwater/article/details/40709609

 

 有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯被打开,       开着灯将被关闭),依此类推。一共有k个人,问最后有哪些灯开着?

    输入:n和k,输出开着的灯编号。k≤n≤1000。

 

   样例输入:7  3

 

   样例输出:1 5 6 7

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 #define MAXN 1000 + 10
 5 int a[MAXN];
 6 
 7 int main(int argc, char *argv[])
 8 {
 9   int i, j, n, k, first = 1;
10   scanf("%d %d", &n, &k);
11   memset(a, -1, sizeof(a));
12   for(i = 1; i <= k; i++)
13      for(j = 1; j <= n; j++)
14      {
15         if(j%i == 0) a[j] = -a[j];
16      }
17      /* 
18   for(j = 1; j <= n; j++)
19      if(a[j] == 1) printf("%d ", j); //最后应该没空格 
20        
21        */   
22                               
23   for(j = 1; j <= n; j++)
24      if(a[j] == 1) {if(first) first = 0; else printf(" "); printf("%d", j);}
25   printf("\n");     //最后再输出换行符 
26   system("PAUSE");    
27   return 0;
28 }

总结:1. 用一个标志来判断是否为第一次输出,如是,不输出空格,否则先输空格后输数字

        2 开关灯也可以用0 1

 

相关文章
|
6月前
|
人工智能 JSON 自然语言处理
别手写断言了!Copilot for Testing 让我提前两小时下班
本文分享作者如何用GitHub Copilot智能生成接口测试断言,提升自动化测试质量与效率:告别手写冗余断言,通过自然语言描述、示例引导和缺失检查,实现“断言全覆盖”;实测断言编写提速3倍、覆盖更全、错误更少,让测试真正从“跑通”迈向“测对”。
|
10月前
|
人工智能 算法 调度
阿里云ACK托管集群Pro版共享GPU调度操作指南
本文介绍在阿里云ACK托管集群Pro版中,如何通过共享GPU调度实现显存与算力的精细化分配,涵盖前提条件、使用限制、节点池配置及任务部署全流程,提升GPU资源利用率,适用于AI训练与推理场景。
765 1
|
8月前
|
弹性计算 运维 安全
公司注册阿里云账号全流程指南:所需材料、步骤拆解与常见问题解答
对于企业用户来说,注册阿里云账号并完成企业实名认证,是使用云服务器、数据库、短信服务等企业级云产品的前提。整个过程主要分为 “账号注册” 和 “企业实名认证” 两步,操作并不复杂,但需要提前准备好对应材料,避免因信息不全反复修改。本文结合最新的操作界面和规则,用通俗的语言拆解每一步流程,明确所需材料清单,同时解答注册过程中常见的问题,帮企业快速完成账号开通与认证。
|
存储 人工智能 运维
idc机房智能运维解决方案
华汇数据中心一体化智能运维方案应运而生,以“自主可控、精准洞察、智能决策”三大核心能力,助力企业实现运维效率提升与综合成本下降的数字化转型目标。
1022 24
|
设计模式 JavaScript 前端开发
软件工程师,如何搞副业赚钱
在这个数字化时代,软件工程师凭借其深厚的技术功底与创新思维,早已成为推动社会经济发展的重要力量。然而,随着生活成本的提升以及对个人价值实现的追求,越来越多的软件工程师开始思考如何利用自身技能和业余时间开展副业,以实现“财务自由”和职业发展的双重目标。 当然,这里的“财务自由”打了引号。想通过副业实现“财务自由”还是非常有挑战性的,可能需要一定的机遇和运气。但在完成本职工作的基础上,通过搞副业赚钱,可以提升我们全方位的能力,并为后续的创业打下坚实的基础和储备。
904 5
|
人工智能 缓存 运维
智能体场景中,传统QPS指标不适用该怎么办?一文了解智能体性能评估的5大关键流程
本文由产品专家三桥君探讨了智能体应用中的性能评估与优化策略。三桥君指出传统QPS指标已无法全面反映智能体场景的用户体验瓶颈,强调需关注模型推理耗时与用户感知时延。三桥君提出五步评估流程:请求量分析、时段采样、耗时测算、压测对比及性能指标确定,并从推理(模型剪枝/硬件优化)、编排(异步处理/缓存)及运维(多活部署/监控)三个层面给出优化方案。通过系统化方法,可显著提升智能体响应速度与用户体验。
708 0
|
机器学习/深度学习 搜索推荐 算法
无需训练即可创建数字人,字节PersonaTalk视频口型编辑超SOTA
字节跳动研究人员提出了PersonaTalk,一种创新的音频驱动视觉配音方法,通过两阶段框架实现高保真度和个性化的口型同步视频生成。该方法无需特定人物训练,具有广泛的应用前景。
1283 11
|
机器学习/深度学习 人工智能 自然语言处理
AIGC是什么?对艺术设计学、视觉传达设计、数字媒体艺术等专业的影响
AIGC,人工智能生成内容,融合AI与内容创作,使用GAN、CLIP等技术自动生成图像、文本等,影响艺术设计、视觉传达、数字媒体领域。它提升创作效率,增加多样性,促进创新,改变教育方式,并与Adobe国际认证结合,为设计师提供竞争优势,引领行业变革。
|
机器学习/深度学习 搜索推荐 算法框架/工具
使用Python实现深度学习模型:智能运动表现分析
使用Python实现深度学习模型:智能运动表现分析
863 1