📜  开门数量 | TCS 编码问题

📅  最后修改于: 2021-10-26 05:15:45             🧑  作者: Mango

考虑一侧有N 个门的长巷。所有的门最初都是关闭的。你在巷子里来回移动,改变门的状态如下:

  • 你打开一扇已经关闭的门,你关闭一扇已经打开的门。
  • 你从一端开始继续改变门的状态,直到你到达另一端,然后你回来再次开始改变门的状态。
  • 在第一次尝试中,您更改编号为1, 2, 3, …, N的门的状态。
  • 在第二步中,您更改编号为2、4、6、…的门的状态。
  • 在第三次运行中,您更改编号为 3、6、9 的门的状态。
  • 等等…

上述过程将一直持续到您更改编号为N的门的状态的N回合。任务是找出程序结束时打开的门的数量。

例子:

方法:根据以下观察可以解决给定的问题:

  • 一扇门最终只能打开,当且仅当它有奇数个因子,因为每个门被它的每个因子访问一次。
  • 最初,所有的门都是关闭的,所以如果它有偶数个因子,它将保持关闭状态,如果它有奇数个因子,它将保持打开状态。
  • 因此,从1N保持打开状态的门总数将是具有奇数因子的门数。

从上面的观察,只有是具有奇数个因数的完全平方数。因此,从1N保持打开的门总数将是1N之间的完全正方形的数量,而1N之间的完全正方形的数量是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)