考虑一侧有N 个门的长巷。所有的门最初都是关闭的。你在巷子里来回移动,改变门的状态如下:
- 你打开一扇已经关闭的门,你关闭一扇已经打开的门。
- 你从一端开始继续改变门的状态,直到你到达另一端,然后你回来再次开始改变门的状态。
- 在第一次尝试中,您更改编号为1, 2, 3, …, N的门的状态。
- 在第二步中,您更改编号为2、4、6、…的门的状态。
- 在第三次运行中,您更改编号为 3、6、9 …的门的状态。
- 等等…
上述过程将一直持续到您更改编号为N的门的状态的第N个回合。任务是找出程序结束时打开的门的数量。
例子:
Input: N = 3
Output: 1
Input: N = 100
Output: 10
方法:根据以下观察可以解决给定的问题:
- 一扇门最终只能打开,当且仅当它有奇数个因子,因为每个门被它的每个因子访问一次。
- 最初,所有的门都是关闭的,所以如果它有偶数个因子,它将保持关闭状态,如果它有奇数个因子,它将保持打开状态。
- 因此,从1到N保持打开状态的门总数将是具有奇数因子的门数。
从上面的观察,只有是具有奇数个因数的完全平方数。因此,从1到N保持打开的门总数将是1到N之间的完全正方形的数量,而1到N之间的完全正方形的数量是sqrt(N) 。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// Function that counts the number of
// doors opens after the Nth turn
int countOpenDoors(int N)
{
// Find the number of open doors
int doorsOpen = sqrt(N);
// Return the resultant count of
// open doors
return doorsOpen;
}
// Driver Code
int main()
{
int N = 100;
cout << countOpenDoors(N);
return 0;
}
Java
/*package whatever //do not write package name here */
import java.io.*;
class GFG
{
// Function that counts the number of
// doors opens after the Nth turn
static int countOpenDoors(int N)
{
// Find the number of open doors
int doorsOpen = (int) Math.sqrt(N);
// Return the resultant count of
// open doors
return doorsOpen;
}
// Driver Code
public static void main (String[] args) {
int N = 100;
System.out.println(countOpenDoors(N));
}
}
// This code is contributed by Potta Lokesh
Python3
# Python3 code for the above approach
import math
# Function that counts the number of
# doors opens after the Nth turn
def countOpenDoors(N):
# Find the number of open doors
doorsOpen = int(math.sqrt(N))
# Return the resultant count of
# open doors
return doorsOpen
# Driver Code
if __name__ == '__main__':
N = 100
print(countOpenDoors(N))
# This code is contributed by MuskanKalra1
C#
using System;
class GFG {
// Function that counts the number of
// doors opens after the Nth turn
static int countOpenDoors(int N)
{
// Find the number of open doors
int doorsOpen = (int)Math.Sqrt(N);
// Return the resultant count of
// open doors
return doorsOpen;
}
// Driver Code
public static void Main()
{
int N = 100;
Console.Write(countOpenDoors(N));
}
}
// This code is contributed by subhammahato348.
Javascript
输出
10
时间复杂度: O(log N)
辅助空间: O(1)