一行代码就能解决的智力算法题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_44771588/article/details/102615967

这次分享一道LeetCode上很有意思的题目,如果理解清楚了题意,只需要一行代码就能解决。
文字有点多,请仔细看
问题描述:初始时有n个灯泡关闭。第1轮,你打开所有的灯泡。第2轮,每两个灯泡关闭一次。第3轮,每3个灯泡关闭一次。第i轮,每 i 个灯泡切换一次开关。对于第n轮,你只切换最后一个灯泡的开关。找出n轮后又多少个亮着的灯泡。
解释:初始时:灯泡状态【关闭,关闭,关闭】、
第一轮后:灯泡状态【开启,开启,开启】。
第二轮后:灯泡状态【开启,关闭,开启】。
第三轮后:灯泡状态【开启,关闭,关闭】。
输入:3
输出:1
首先,因为灯泡一开始都是关闭的,所以某一栈灯泡最后如何是亮的,必然要被按奇数次开关。
我们假设只有6栈灯泡,而且只看6栈。需要进行6轮操作,而对于第6栈灯,会被按下几次开关呢?这不难看出,第一轮会被按,第2轮,第3轮,第6轮都会被按。
也就是说1、2、3、6都会被按。为什么呢?
因为6 = 1 * 6=2 * 3。 我们把这些叫做因子,因子一般都是成对出现的,也就是说开关被按的次数一般是偶数次。但是有特殊情况,比如说总共有16栈灯泡,那么第16栈会被按几次?
16 = 1 * 16 = 2 * 8 = 4 * 4
其中4这个因子重复出现了。所以第16栈灯只被按了5次,奇数次。现在问题已经解决了。
假设有16栈灯,我们求16的平方根就好了。因为16里面有1,4,9,16,分别是1,2,3,4的平方,而这些都是奇数次按的。
那么结果出来了。下面贴上代码

#include<stdio.h>
#include<math.h>

int main()
{
	int n = 16;
	printf("%d\n", (int)sqrt(n));
	return 0;
}

此题不知哪位大神解出来的,具体哪位忘记了,之后发现会补上。

猜你喜欢

转载自blog.csdn.net/weixin_44771588/article/details/102615967