给定一个大于2的整数N ,任务是找到一个元素M ,以使GCD(N,M)最大。
例子:
Input: N = 10
Output: 5
Explanation:
gcd(1, 10), gcd(3, 10), gcd(7, 10), gcd(9, 10) is 1,
gcd(2, 10), gcd(4, 10), gcd(6, 10), gcd(8, 10) is 2,
gcd(5, 10) is 5 which is maximum.
Input: N = 21
Output: 7
Explanation:
gcd(7, 21) is maximum among all the integers from 1 to 21.
天真的方法:最简单的方法是遍历[1,N-1]范围内的所有数字,并找到每个数字的GCD和N。给定最大GCD为N的数字是必需的结果。
时间复杂度: O(N)
辅助空间: O(1)
高效方法:为优化上述方法,我们观察到两个数字的GCD肯定是其在[1,N-1]范围内的除数之一。并且,如果除数最大,则GCD将最大。
因此,该想法是找到N的所有除数,并存储这些除数的最大值,这是所需的结果。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// Function to find the integer M
// such that gcd(N, M) is maximum
int findMaximumGcd(int n)
{
// Initialize a variable
int max_gcd = 1;
// Find all the divisors of N and
// return the maximum divisor
for (int i = 1; i * i <= n; i++) {
// Check if i is divisible by N
if (n % i == 0) {
// Update max_gcd
if (i > max_gcd)
max_gcd = i;
if ((n / i != i)
&& (n / i != n)
&& ((n / i) > max_gcd))
max_gcd = n / i;
}
}
// Return the maximum value
return max_gcd;
}
// Driver Code
int main()
{
// Given Number
int N = 10;
// Function Call
cout << findMaximumGcd(N);
return 0;
}
Java
// Java program for the above approach
import java.util.*;
class GFG{
// Function to find the integer M
// such that gcd(N, M) is maximum
static int findMaximumGcd(int n)
{
// Initialize a variable
int max_gcd = 1;
// Find all the divisors of N and
// return the maximum divisor
for(int i = 1; i * i <= n; i++)
{
// Check if i is divisible by N
if (n % i == 0)
{
// Update max_gcd
if (i > max_gcd)
max_gcd = i;
if ((n / i != i) &&
(n / i != n) &&
((n / i) > max_gcd))
max_gcd = n / i;
}
}
// Return the maximum value
return max_gcd;
}
// Driver Code
public static void main(String[] args)
{
// Given Number
int N = 10;
// Function Call
System.out.print(findMaximumGcd(N));
}
}
// This code is contributed by Amit Katiyar
Python3
# Python3 program for the above approach
# Function to find the integer M
# such that gcd(N, M) is maximum
def findMaximumGcd(n):
# Initialize variables
max_gcd = 1
i = 1
# Find all the divisors of N and
# return the maximum divisor
while (i * i <= n):
# Check if i is divisible by N
if n % i == 0:
# Update max_gcd
if (i > max_gcd):
max_gcd = i
if ((n / i != i) and
(n / i != n) and
((n / i) > max_gcd)):
max_gcd = n / i
i += 1
# Return the maximum value
return (int(max_gcd))
# Driver Code
if __name__ == '__main__':
# Given number
n = 10
# Function call
print(findMaximumGcd(n))
# This code is contributed by virusbuddah_
C#
// C# program for the
// above approach
using System;
class GFG{
// Function to find the
// integer M such that
// gcd(N, M) is maximum
static int findMaximumGcd(int n)
{
// Initialize a variable
int max_gcd = 1;
// Find all the divisors of
// N and return the maximum
// divisor
for(int i = 1;
i * i <= n; i++)
{
// Check if i is
// divisible by N
if (n % i == 0)
{
// Update max_gcd
if (i > max_gcd)
max_gcd = i;
if ((n / i != i) &&
(n / i != n) &&
((n / i) > max_gcd))
max_gcd = n / i;
}
}
// Return the maximum
// value
return max_gcd;
}
// Driver Code
public static void Main(String[] args)
{
// Given Number
int N = 10;
// Function Call
Console.Write(findMaximumGcd(N));
}
}
// This code is contributed by Rajput-Ji
输出:
5
时间复杂度: O(log 2 N)
辅助空间: O(1)