2014-03-20 01:14

题目:有100栈灯,一开始都关着。如果你按照n从1~100的顺序,每次都掰一下n的倍数的开关(开->关,关->开),那么到最后有多少灯是亮的?

解法:这个题目要多想想再动手,因为想通了以后就基本不用动手了。对于编号为x的灯,每当ix的约数时,在第i轮时第x号灯就被掰了一次。比如6的约数为{1,2,3,6},6号灯被掰了4次。那么,每个灯被掰的次数就是约数个数次。约数个数的公式你懂的,但是用不着去算。如果一盏灯是开的,那么它就被掰了奇数次,根据约数和公式,只有因数分解之后所有指数都是偶数的时候,约数个数才为奇数。比如36的约数{1,2,3,4,6,9,12,18,36}。只有完全平方数满足条件。还有另一种想法,如果一个数n不是完全平方数,那么n的约数一定可以分为个数相同的两拨儿,一拨儿大于平方根,一拨儿小于平方根,配对正好成绩等于n。只有完全平方数才会多出一个整数的平方根,导致约数个数为奇数。

代码:

 1 // 6.6 Given n lights, every time you toggle the switches of k-multiples. k goes from 1 to n.
 2 // Assume they're all off at first, how many of them are on at last.
 3 #include <cstdio>
 4 using namespace std;
 5
 6 // My solution:
 7 //    For a number m between 1~n, the key is total number of divisors of m, defined as num_div(m).
 8 //    The light m is toggled for num_div(m) times. If it is odd, light is on. Even and light is off.
 9 //    Only perfect square can be factorized, where every prime factor has even exponents.
10 //    That is, m = p[0]^e[0] * p[1]^e[1] * ... * p[whatever]^e[whatever]
11 //    num_div(m) = (e[0] + 1) * (e[1] + 1) * ... * (e[whatever] + 1)
12 //    If num_div(m) is to be odd, every multiplier has to be odd, every e[i] has to be even.
13 //    Thus m has to be a perfect square, if light m is on at last.
14 int main()
15 {
16     int n;
17     int i;
18
19     while (scanf("%d", &n) == 1 && n > 0) {
20         for (i = 1; i <= n / i; ++i) {
21             printf("%d ", i * i);
22         }
23         printf("\n");
24         printf("%d light(s) is(are) on.\n", i - 1);
25     }
26
27     return 0;
28 }

转载于:https://www.cnblogs.com/zhuli19901106/p/3612749.html

《Cracking the Coding Interview》——第6章:智力题——题目6相关推荐

  1. [Free] Cracking the Coding Interview 6th Download

    [Free] Cracking the Coding Interview 6th Download 推荐给有梯子的童鞋们! https://www.pdfdrive.com/cracking-the- ...

  2. Cracking the coding interview

    转自:http://hawstein.com/posts/ctci-solutions-contents.html Cracking the coding interview--问题与解答 March ...

  3. 经典算法题目:Cracking the coding interview 问题与解答

    Cracking the coding interview--问题与解答 March 14, 2013 作者:Hawstein 出处: http://hawstein.com/posts/ctci-s ...

  4. 《Cracking the Coding Interview》——第6章:智力题——题目4

    2014-03-20 01:02 题目:无力描述的一道智力题,真是货真价实的智力题,让我充分怀疑自己智力的智力题.有兴趣的还是看书去吧. 解法:能把题目看懂,你就完成80%了,用反证法吧. 代码: 1 ...

  5. 渣基础:比照Hawstein学Cracking the coding interview(1)

    <C++ Primer 第五版>书实在是太长,太厚了.总是看了十几页就看累了,坚持不了多久,想了想还是别勉强自己,决定把它当工具书查看,或者积累足够的C++经验后再翻阅一遍. 目前的打算是 ...

  6. 《Cracking the Coding Interview》——第6章:智力题——题目5

    2014-03-20 01:08 题目:扔鸡蛋问题.有一个鸡蛋,如果从N楼扔下去恰好会摔碎,低于N楼则不碎,可以继续扔.给你两个这样的鸡蛋,要求你一定得求出N,怎么扔才能减少最坏情况下的扔的次数? 解 ...

  7. 《Cracking the Coding Interview》——第18章:难题——题目11

    2014-04-29 04:30 题目:给定一个由'0'或者'1'构成的二维数组,找出一个四条边全部由'1'构成的正方形(矩形中间可以有'0'),使得矩形面积最大. 解法:用动态规划思想,记录二维数组 ...

  8. 《Cracking the Coding Interview》——第18章:难题——题目3

    2014-04-29 01:02 题目:从m个整数里随机选出n个整数,要求等概率. 解法:和洗牌的算法类似,每次随机抽出一个数,抽n次即可.时间复杂度O(m * n),空间复杂度O(m). 代码: 1 ...

  9. 《Cracking the Coding Interview》——第16章:线程与锁——题目3

    2014-04-27 19:26 题目:哲学家吃饭问题,死锁问题经典模型(专门用来黑哲学家的?). 解法:死锁四条件:1. 资源互斥.2. 请求保持.3. 非抢占.4. 循环等待.所以,某砖家拿起一只 ...

最新文章

  1. 【Codeforces】808D Array Division(前后两部分和相等)
  2. 微信小程序-控制文本只显示若干行多余隐藏
  3. 人工智能到来的时代,你曾经瞧不起的职业,可能会非常吃香!
  4. mysql权限表_MySQL 数据库赋予用户权限操作表
  5. codeblocks如何让输出结果 空格_简单讲讲如何实现两个正整数相加,然后输出这个结果...
  6. Eclipse中web项目的默认发布路径改为外部Tomcat中webapp路径
  7. HTML li标签排列有空白间隙
  8. python编辑器编程猫_编程猫Python编辑器 Mac版0.4.0 下载 - 51下载网
  9. easyui日期控件datebox的onchange事件
  10. 数据库应用——MySQL+ATLAS+MMM高可用集群
  11. 【labelme格式json转为labelimg格式的xml(VOC)】
  12. 纪念一次面试机试失败的题目:
  13. 罗技LogitechFlow技术--惊艳的多电脑切换体验
  14. 802.11成帧封装实现(五)
  15. 愚人节整人软件测试自学,愚人节被玩坏的五大整人APP 帮你问鼎愚人节最佳损友...
  16. I.MX6ULL ARM驱动开发---设备树下的LED驱动实验
  17. 计算机教师格言座右铭,教师人生格言座右铭
  18. XGATE on S12X
  19. win10任务栏固定图标消失
  20. mac PHP开发环境搭建abc

热门文章

  1. linux 设备文件动态,使用 udev 高效、动态地管理 Linux 设备文件
  2. 模式识别和机器学习有必要学么_【视觉】机器视觉表面缺陷检测综述(下)
  3. ubuntu: sudo apt-get update老是失败怎么办?
  4. 【AI实时变声器,声音甜甜的小姐姐背后竟是抠脚大汉】
  5. Hololens 开发笔记(10)——World Anchor
  6. JSD-2204-WebServer(项目)-二维码-Day16
  7. 前端页面请求PHP接口返回超大数据(几万条以上)解决办法总结
  8. 浅谈拉格朗日插值法及其应用
  9. 机电一体化c语言程序设计,机电一体化专业《C语言程序设计》课程标准
  10. VBA,index() + small() + if() 实现数据分组:EXCEL数组公式万金油套路, 顺便介绍另外2个方法:数据透视表,VBA字典