📌  相关文章
📜  修改数组,使该数组不包含除1以外的任何公共除数

📅  最后修改于: 2021-04-17 13:55:09             🧑  作者: Mango

给定一个由n个整数和一个整数X组成的数组arr [] ,任务是检查是否有可能通过重复分割数组的任何数组元素来修改该数组,以使该数组不包含除1以外的任何公共除数。通过任何其除数d的阵列(d≤X)。如果可以修改数组使其满足给定条件,则打印“是” 。否则,打印“否”

例子:

方法:想法是使用Eucledian的GCD查找给定数组的GCD。这给出了数组元素的所有共同因素。通过消除所有这些因素,就不会保留任何共同因素。因此,可以生成这样的阵列。否则,将无法生成这样的数组。

请按照以下步骤解决问题:

  1. 初始化一个变量,例如G,以存储给定数组的GCD。
  2. 遍历数组arr []并计算GCD并将其存储在变量中,例如G。
  3. [2,X]范围内进行迭代并检查G的除数是否大于X。
  4. 如果发现是真的,则打印“否” 。否则,打印“是”。
  5. 否则,通过将所有元素除以G修改数组,然后打印数组元素。

下面是上述方法的实现:

C++
// C++ program for the above approach
 
#include 
using namespace std;
 
// Function to check if it is possible
// to modify the array such that
// there is no common factor between
// array elements except 1
void checkCommonDivisor(int arr[],
                        int N, int X)
{
    // Stores GCD of the array
    int G = 0;
 
    // Calculate GCD of the array
    for (int i = 0; i < N; i++) {
        G = __gcd(G, arr[i]);
    }
 
    int copy_G = G;
 
    for (int divisor = 2;
         divisor <= X; divisor++) {
 
        // If the current divisor
        // is smaller than X
        while (G % divisor == 0) {
 
            // Divide GCD by the
            // current divisor
            G = G / divisor;
        }
    }
 
    // If possible
    if (G <= X) {
        cout << "Yes\n";
 
        // Print the modified array
        for (int i = 0; i < N; i++)
            cout << arr[i] / copy_G << " ";
        cout << endl;
    }
 
    // Otherwise
    else
        cout << "No";
}
 
// Driver Code
int main()
{
    // Given array
    int arr[] = { 6, 15, 6 }, X = 6;
 
    // Size of the array
    int N = sizeof(arr) / sizeof(arr[0]);
 
    checkCommonDivisor(arr, N, X);
}


Java
// Java program for the above approach
class GFG{
 
// Function to check if it is possible
// to modify the array such that
// there is no common factor between
// array elements except 1
static void checkCommonDivisor(int[] arr,
                               int N, int X)
{
     
    // Stores GCD of the array
    int G = 0;
 
    // Calculate GCD of the array
    for(int i = 0; i < N; i++)
    {
        G = gcd(G, arr[i]);
    }
 
    int copy_G = G;
 
    for(int divisor = 2;
            divisor <= X;
            divisor++)
    {
 
        // If the current divisor
        // is smaller than X
        while (G % divisor == 0)
        {
             
            // Divide GCD by the
            // current divisor
            G = G / divisor;
        }
    }
 
    // If possible
    if (G <= X)
    {
        System.out.println("Yes");
 
        // Print the modified array
        for(int i = 0; i < N; i++)
            System.out.print((arr[i] / copy_G) + " ");
             
        System.out.println();
    }
 
    // Otherwise
    else
        System.out.println("No");
}
 
// Calculating gcd
static int gcd(int a, int b)
{
    if (b == 0)
        return a;
         
    return gcd(b, a % b);
}
 
// Driver Code
public static void main(String[] args)
{
    int[] arr = { 6, 15, 6 };
    int X = 6;
 
    // Size of the array
    int N = arr.length;
 
    checkCommonDivisor(arr, N, X);
}
}
 
// This code is contributed by user_qa7r


Python3
# Python3 program for the above approach
import math
 
# Function to check if it is possible
# to modify the array such that
# there is no common factor between
# array elements except 1
def checkCommonDivisor(arr, N, X):
 
    # Stores GCD of the array
    G = 0
 
    # Calculate GCD of the array
    for i in range(N):
        G = math.gcd(G, arr[i])
 
    copy_G = G
 
    for divisor in range(2, X + 1):
 
        # If the current divisor
        # is smaller than X
        while (G % divisor == 0):
 
            # Divide GCD by the
            # current divisor
            G = G // divisor
 
    # If possible
    if (G <= X):
        print("Yes")
 
        # Print the modified array
        for i in range(N):
            print(arr[i] // copy_G, end = " ")
             
        print()
 
    # Otherwise
    else:
        print("No")
 
# Driver Code
if __name__ == "__main__":
 
    # Given array
    arr = [6, 15, 6]
    X = 6
 
    # Size of the array
    N = len(arr)
    checkCommonDivisor(arr, N, X)
 
# This code is contributed by ukasp


C#
// C# program for the above approach
using System;
using System.Collections.Generic;
 
class GFG{
 
static int GCD(int a, int b)
{
    return b == 0 ? a : GCD(b, a % b);
}
  
// Function to check if it is possible
// to modify the array such that
// there is no common factor between
// array elements except 1
static void checkCommonDivisor(int []arr,
                               int N, int X)
{
     
    // Stores GCD of the array
    int G = 0;
 
    // Calculate GCD of the array
    for(int i = 0; i < N; i++)
    {
        G = GCD(G, arr[i]);
    }
 
    int copy_G = G;
 
    for(int divisor = 2;
            divisor <= X;
            divisor++)
    {
         
        // If the current divisor
        // is smaller than X
        while (G % divisor == 0)
        {
             
            // Divide GCD by the
            // current divisor
            G = G / divisor;
        }
    }
 
    // If possible
    if (G <= X)
    {
        Console.WriteLine("Yes");
 
        // Print the modified array
        for(int i = 0; i < N; i++)
            Console.Write(arr[i] / copy_G + " ");
             
        Console.Write("\n");
    }
 
    // Otherwise
    else
        Console.WriteLine("No");
}
 
// Driver Code
public static void Main()
{
     
    // Given array
    int []arr = { 6, 15, 6 };
    int X = 6;
 
    // Size of the array
    int N = arr.Length;
 
    checkCommonDivisor(arr, N, X);
}
}
 
// This code is contributed by bgangwar59


输出:
Yes
2 5 2

时间复杂度: O(N * logN)
辅助空间: O(1)