📌  相关文章
📜  找到M,使得M的GCD和给定数N最大

📅  最后修改于: 2021-04-24 03:20:29             🧑  作者: Mango

给定一个大于2的整数N ,任务是找到一个元素M ,以使GCD(N,M)最大。

例子:

天真的方法:最简单的方法是遍历[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)