百度百灯问题
题目:
有100盏灯泡,第一轮点亮所有电灯,第二轮每两盏灯熄灭一盏,即熄灭第2盏,第4盏,以此类推,
第三轮改变编号为3的倍数的电灯,第3盏,第6盏,如果原来那盏灯是亮的,就熄灭它,如果原来是灭的,
就点亮它,以此类推,直到第100轮。问第100结束后,还有多少盏灯泡是亮的?
思路:
灯的编号越大,被操作的次数就会越多。例如:第5次操作的时候,前4盏灯就不会再被操作了,第5盏及后面的灯才有可能被操作。
对于每盏灯,操作的次数是奇数次,灯就是亮的;操作的次数是偶数次,等就是灭的。
每盏灯被操作的次数等于等所在位置编号的约数的个数。(约数的个数要想是奇数,只能是完全平方数。)
若 a>=b ,a%b == 0 。则b是a的约数。
代码:
for i in range(1,101): # i 为灯的位置数 k=0 #记录第i盏灯被操作的次数 for j in range(1,i+1): # j 为操作的次数 if i%j==0: #当操作的次数,是灯位置数的约数时,灯才会被操作 k+=1 #记录灯被操作的次数 if k%2==1: #被操作次数为奇数的灯是亮的 print(i)
输出结果:
1 4 9 16 25 36 49 64 81 100
总结:
1.对于每盏灯,拉动的次数是奇数时,灯就是亮着的,拉动的次数是偶数时,灯就是关着的。
2.每盏灯拉动的次数与它的编号所含约数的个数有关,它的编号有几个约数,这盏灯就被拉动几次。
3.1——100这100个数中有哪几个数,约数的个数是奇数。我们知道一个数的约数都是成对出现的,
只有完全平方数约数的个数才是奇数个。
所以这100盏灯中有10盏灯是亮着的。
它们的编号分别是: 1、4、9、16、25、36、49、64、81、100。