Рубрики

Найти, если n можно записать как произведение k чисел

Учитывая положительное число n, нам нужно вывести ровно k положительных чисел (все больше 1), так что произведение этих k чисел равно n. Если таких k чисел не существует, выведите -1. Если существует много возможных ответов, вы должны напечатать один из тех ответов, где отсортированы k чисел.

Примеры:

Input : n = 54, k = 3
Output : 2, 3, 9
Note that 2, 3 and 9 are k numbers
with product equals to n.

Input : n = 54, k = 8
Output : -1

Эта задача использует идею, очень похожую на вывод всех простых множителей заданного числа .
Идея очень проста. Сначала мы вычисляем все простые множители n и сохраняем их в векторе. Обратите внимание, что мы храним каждое простое число столько раз, сколько оно появляется при его факторизации. Теперь, чтобы найти k чисел больше 1, мы проверяем, больше или равен размер нашего вектора k или нет.

  1. Если размер меньше k, мы печатаем -1.
  2. В противном случае мы печатаем первые коэффициенты k-1 как они есть из вектора, и последний фактор является произведением всех оставшихся элементов вектора.

Обратите внимание, что мы вставили все простые множители отсортированным образом, поэтому все наши числа в векторе отсортированы. Это также удовлетворяет нашему отсортированному условию для k чисел.

C ++

// C ++ программа, чтобы найти, если это возможно
// записать число n как произведение ровно k
// положительные числа больше 1.
#include <bits/stdc++.h>

using namespace std;

  
// Печатает k факторов из n, если n может быть записано
// как кратное число k Остальное печатает -1.

void kFactors(int n, int k)

{

    // Вектор для хранения всех простых множителей n

    vector<int> P;

  

    // Вставить все 2 в векторе

    while (n%2 == 0)

    {

        P.push_back(2);

        n /= 2;

    }

  

    // n должен быть нечетным в этой точке

    // Поэтому мы пропускаем один элемент (i = i + 2)

    for (int i=3; i*i<=n; i=i+2)

    {

        while (n%i == 0)

        {

            n = n/i;

            P.push_back(i);

        }

    }

  

    // Это для обработки, когда n> 2 и

    // n простое

    if (n > 2)

        P.push_back(n);

  

    // Если размер (P) <k, k коэффициентов невозможны

    if (P.size() < k)

    {

        cout << "-1" << endl;

        return;

    }

  

    // печать первых k-1 факторов

    for (int i=0; i<k-1; i++)

        cout << P[i] << ", ";

  

    // расчет и распечатка продукта отдыха

    // чисел

    int product = 1;

    for (int i=k-1; i<P.size(); i++)

        product = product*P[i];

    cout << product << endl;

}

  
// Программа драйвера для проверки вышеуказанной функции

int main()

{

    int n = 54, k = 3;

    kFactors(n, k);

    return 0;

}

Джава

// Java-программа, чтобы найти, если это возможно
// записать число n как произведение ровно k
// положительные числа больше 1.

import java.util.*;

  

class GFG

{

      
// Печатает k факторов из n, если n может быть записано
// как кратное число k Остальное печатает -1.

static void kFactors(int n, int k)

{

    // Вектор для хранения всех простых множителей n

    ArrayList<Integer> P = new ArrayList<Integer>();

  

    // Вставить все 2 в списке

    while (n % 2 == 0)

    {

        P.add(2);

        n /= 2;

    }

  

    // n должен быть нечетным в этой точке

    // Поэтому мы пропускаем один элемент (i = i + 2)

    for (int i = 3; i * i <= n; i = i + 2)

    {

        while (n % i == 0)

        {

            n = n / i;

            P.add(i);

        }

    }

  

    // Это для обработки, когда n> 2 и

    // n простое

    if (n > 2)

        P.add(n);

  

    // Если размер (P) <k, k факторов

    // невозможно

    if (P.size() < k)

    {

        System.out.println("-1");

        return;

    }

  

    // печать первых k-1 факторов

    for (int i = 0; i < k - 1; i++)

        System.out.print(P.get(i) + ", ");

  

    // расчет и печать продукта

    // из остальных чисел

    int product = 1;

    for (int i = k - 1; i < P.size(); i++)

        product = product * P.get(i);

    System.out.println(product);

}

  
// Код драйвера

public static void main(String[] args)

{

    int n = 54, k = 3;

    kFactors(n, k);

}
}

  
// Этот код добавлен
// от chandan_jnu

python3

# Python3 программа, чтобы найти, если это возможно
# написать число n как произведение ровно k
# положительных чисел больше 1.

import math as mt

  
# Печатает k факторов из n, если n может быть записано
# как кратное число k. Остальное печатает -1

def kFactors(n, k):

      

    # список для хранения всех простых факторов n

    a = list()

      

    # вставить все 2 в списке

    while n % 2 == 0:

        a.append(2)

        n = n // 2

          

    # n должен быть нечетным в этой точке

    # поэтому мы пропускаем один элемент (i = i + 2)

    for i in range(3, mt.ceil(mt.sqrt(n)), 2):

        while n % i == 0:

            n = n / i;

            a.append(i)

              

    # Это обрабатывается, когда n> 2 и

    # n простое число

    if n > 2:

        a.append(n)

          

    # если size (a) <k, k факторов невозможны

    if len(a) < k:

        print("-1")

        return

          

    # печать первых k-1 факторов

    for i in range(k - 1):

        print(a[i], end = ", ")

      

    # расчетно-полиграфический продукт

    # из остальных чисел

    product = 1

      

    for i in range(k - 1, len(a)):

        product *= a[i]

    print(product)

  
# Код драйвера

n, k = 54, 3

kFactors(n, k)

  
# Этот код добавлен
# от mohit kumar 29

C #

// C # программа, чтобы найти, если это возможно
// записать число n как произведение ровно k
// положительные числа больше 1.

using System;

using System.Collections;

  

class GFG

{

      
// Печатает k факторов из n, если n может быть записано
// как кратное число k Остальное печатает -1.

static void kFactors(int n, int k)

{

    // Вектор для хранения всех простых множителей n

    ArrayList P = new ArrayList();

  

    // Вставить все 2 в списке

    while (n % 2 == 0)

    {

        P.Add(2);

        n /= 2;

    }

  

    // n должен быть нечетным в этой точке

    // Поэтому мы пропускаем один элемент (i = i + 2)

    for (int i = 3; i * i <= n; i = i + 2)

    {

        while (n % i == 0)

        {

            n = n / i;

            P.Add(i);

        }

    }

  

    // Это для обработки, когда n> 2 и

    // n простое

    if (n > 2)

        P.Add(n);

  

    // Если размер (P) <k, k коэффициентов невозможны

    if (P.Count < k)

    {

        Console.WriteLine("-1");

        return;

    }

  

    // печать первых k-1 факторов

    for (int i = 0; i < k - 1; i++)

        Console.Write(P[i]+", ");

  

    // расчет и распечатка продукта отдыха

    // чисел

    int product = 1;

    for (int i = k - 1; i < P.Count; i++)

        product = product*(int)P[i];

    Console.WriteLine(product);

}

  
// Код драйвера

static void Main()

{

    int n = 54, k = 3;

    kFactors(n, k);

}
}

  
// Этот код предоставлен chandan_jnu

PHP

<?php
// PHP программа, чтобы найти, если это возможно
// записать число n как произведение ровно k
// положительные числа больше 1.

  
// Печатает k факторов из n, если n может быть записано
// как кратное число k Остальное печатает -1.

function kFactors($n, $k

    // Вектор для хранения всех простых

    // факторы п

    $P = array(); 

  

    // Вставить все 2 в векторе

    while ($n % 2 == 0) 

    

        array_push($P, 2); 

        $n = (int)($n / 2); 

    

  

    // n должен быть нечетным в этой точке

    // Поэтому мы пропускаем один элемент (i = i + 2)

    for ($i = 3; $i * $i <= $n; $i = $i + 2) 

    

        while ($n % $i == 0) 

        

            $n = (int)($n / $i); 

            array_push($P, $i); 

        

    

  

    // Это для обработки, когда n> 2 и

    // n простое

    if ($n > 2) 

        array_push($P, $n); 

  

    // Если размер (P) <k, k факторов

    // невозможно

    if (count($P) < $k

    

        echo "-1\n"

        return

    

  

    // печать первых k-1 факторов

    for ($i = 0; $i < $k - 1; $i++) 

        echo $P[$i] . ", "

  

    // расчет и печать продукта

    // из остальных чисел

    $product = 1; 

    for ($i = $k - 1; $i < count($P); $i++) 

        $product = $product * $P[$i]; 

    echo $product

  
// Код драйвера

$n = 54;

$k = 3; 

kFactors($n, $k); 

  
// Этот код предоставлен mits
?>


Выход:

2, 3, 9

Эта статья предоставлена Пратиком Чхаджером . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Найти, если n можно записать как произведение k чисел

0.00 (0%) 0 votes