给定一个整数N (?2),任务是通过范围为[1,N]的整数找到所有对中的最大GCD。
例子:
Input: N = 5
Output: 2
Explanation :
GCD(1, 2) : 1
GCD(1, 3) : 1
GCD(1, 4) : 1
GCD(1, 5) : 1
GCD(2, 3) : 1
GCD(2, 4) : 2
GCD(2, 5) : 1
GCD(3, 4) : 1
GCD(3, 5) : 1
GCD(4, 5) : 1
Input: N = 6
Output: 3
Explanation: GCD of pair (3, 6) is the maximum.
天真的方法:
解决问题的最简单方法是从[1,N]生成所有可能的对,并计算每对的GCD 。最后,打印获得的最大GCD。
时间复杂度: O(N 2 logN)
辅助空间: O(1)
高效方法:
请按照以下步骤解决问题:
- 由于所有对都是不同的,因此,对于任何具有GCD g的对{a,b} , a或b都大于g 。
- 认为b是更大的数字, b? 2g ,因为2g是大于g的g的最小倍数。
- 由于b不能超过N ,所以2g? N.
- 因此, g? floor(n / 2) 。
- 因此,可以得到的最大GCD是地板(N / 2),当对选定的是(地板(N / 2),2 *地板(N / 2))。
Illustration:
N = 6
Maximum GCD = 6/2 = 3, occurs for the pair (3, 6)
下面是上述方法的实现:
C++
// C++ Program to implement
// the approach
#include
using namespace std;
// Function to obtain the maximum
// gcd of all pairs from 1 to n
void find(int n)
{
// Print the answer
cout << n / 2 << endl;
}
// Driver code
int main()
{
int n = 5;
// Function call
find(n);
return 0;
}
Java
// Java Program to implement
// the approach
class GFG{
// Function to obtain the maximum
// gcd of all pairs from 1 to n
static void find(int n)
{
// Print the answer
System.out.println(n / 2);
}
// Driver code
public static void main(String[] args)
{
int n = 5;
// Function call
find(n);
}
}
// This code is contributed by Ritik Bansal
Python3
# Python3 program to implement
# the approach
# Function to obtain the maximum
# gcd of all pairs from 1 to n
def find(n):
# Print the answer
print(n // 2)
# Driver Code
if __name__ == '__main__':
# Given n
n = 5
# Function call
find(n)
# This code is contributed by Shivam Singh
C#
// C# Program to implement
// the approach
using System;
class GFG{
// Function to obtain the maximum
// gcd of all pairs from 1 to n
static void find(int n)
{
// Print the answer
Console.Write(n / 2);
}
// Driver code
public static void Main(string[] args)
{
int n = 5;
// Function call
find(n);
}
}
// This code is contributed by rock_cool
Javascript
输出:
2
时间复杂度: O(1)
辅助空间: O(1)