String más pequeña sin ningún signo de multiplicación que representa el producto de dos números dados

Dados dos números A y B , la tarea es imprimir la string de la longitud más pequeña posible que se evalúe como el producto de los dos números dados, es decir, A*B , sin usar el signo de multiplicación.

Cualquier potencia perfecta de 2 se puede expresar en forma de un operador de desplazamiento a la izquierda. 
Por ejemplo: 
N = 2 = 1<<1 = “<<1” 
N = 4 = 1<<2 = “<<2” 
Usando la idea anterior, cualquier número se puede expresar usando un operador de desplazamiento a la izquierda en lugar de un signo de multiplicación. 
Por ejemplo: 
N = 24 = 6*4 = 6(1<<2) = “6<<2”

Ejemplos:

Entrada: A = 6, B = 10 
Salida: 6<<3+6<<1
Explicación: 
El producto de los 2 números = 6 × 10 = 60. 
La expresión anterior se evalúa como 6 × (2 × 2 × 2 ) + 6 × 2 = 60. 
La string “10<<2+10<<1” también se evalúa como 60. 
Pero “6<<3+6<<1” es la salida requerida ya que su longitud es más pequeña.

Entrada: A = 5, B = 5 
Salida: 5<<2+5
Explicación: 
El producto de los 2 números = 5 × 5 = 25. 
La expresión anterior se evalúa como 5 × (2 × 2) + 5 = 25 .

Enfoque: La idea es utilizar Left Shift Operator para encontrar el producto. A continuación se muestran los pasos: 

 Sea B = 2 k 1 + 2 k 2 + … + 2 k n , donde k 1 > k 2 > .. > k

  • Por lo tanto, el producto de A y B se puede escribir como

UN * segundo = UN * (2 k 1 + 2 k 2 + … + 2 k norte )

  • Use el “<<“ (operador de desplazamiento a la izquierda) para multiplicar un número por cualquier potencia de dos.
  • Así A x B = A << k 1 + A << k 2 + … + A << k n
  • Para encontrar k i usamos la función log() y continuamos el proceso con el resto B – 2 k i hasta que el resto se vuelve 0 o el logaritmo del resto se vuelve cero.
  • De manera similar, represente A*B = B<< k 1 + B<< k 2 + … + B<< k n representando A como la potencia de 2.
  • Compare las dos representaciones e imprima la string con una longitud más pequeña.

A continuación se muestra la implementación del enfoque anterior:

C++

// C++ program for
// the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to find the string
// which evaluates to the
// product of A and B
string len(long A, long B)
{
  // Stores the result
  string res = "";
  long Log = 0;
 
  do
  {   
    // 2 ^ log <= B &&
    // 2 ^ (log + 1) > B
    Log = (long)(log(B) / log(2));
 
    // Update res to
    // res+=A X 2^log
    if (Log != 0)
    {
      res = res + to_string(A) +
            "<<" + to_string(Log);
    }
    else
    {
      // Update res to
      // res+=A X 2^0
      res += A;
      break;
    }
 
    // Find the remainder
    B = B - (long)pow(2, Log);
 
    // If remainder is
    // not equal to 0
    if (B != 0)
    {
      res += "+";
    }
    else
      break;
  } while (Log != 0);
 
  // Return the
  // resultant string
  return res;
}
 
// Function to find the minimum
// length representation of A*B
void minimumString(long A, long B)
{
  // Find representation of form
  // A << k1 + A << k2 + ... + A << kn
  string res1 = len(A, B);
 
  // Find representation of form
  // B << k1 + B << k2 + ... + B << kn
  string res2 = len(B, A);
 
  // Compare the length of
  // the representations
  if (res1.length() > res2.length())
  {
    cout << res2 << endl;
  }
  else
  {
    cout << res1 << endl;
  }
}
   
// Driver code
int main()
{
  // Product A X B
  long A = 6;
  long B = 10;
 
  // Function Call
  minimumString(A, B);
 
  return 0;
}
 
// This code is contributed by divyeshrabadiya07

Java

// Java program for the above approach
 
class GFG {
 
    // Function to find the string
    // which evaluates to the
    // product of A and B
    public static String len(long A,
long B)
    {
        // Stores the result
        String res = "";
        long log = 0;
 
        do {
 
            // 2 ^ log <= B &&
            // 2 ^ (log + 1) > B
            log = (long)(Math.log(B)
                         / Math.log(2));
 
            // Update res to
            // res+=A X 2^log
            if (log != 0) {
 
                res += A + "<<" + log;
            }
            else {
 
                // Update res to res+=A X 2^0
                res += A;
                break;
            }
 
            // Find the remainder
            B = B - (long)Math.pow(2, log);
 
            // If remainder is not equal
            // to 0
            if (B != 0) {
                res += "+";
            }
            else
                break;
        } while (log != 0);
 
        // Return the resultant string
        return res;
    }
 
    // Function to find the minimum
    // length representation of A*B
    public static void
    minimumString(long A, long B)
    {
        // Find representation of form
        // A << k1 + A << k2 + ... + A << kn
        String res1 = len(A, B);
 
        // Find representation of form
        // B << k1 + B << k2 + ... + B << kn
        String res2 = len(B, A);
 
        // Compare the length of
        // the representations
        if (res1.length() > res2.length()) {
            System.out.println(res2);
        }
        else {
            System.out.println(res1);
        }
    }
 
    // Driver Code
    public static void main(String args[])
    {
        // Product A X B
        long A = 6;
        long B = 10;
 
        // Function Call
        minimumString(A, B);
    }
}

Python3

# Python3 program for the above approach
from math import log
 
# Function to find the string
# which evaluates to the
# product of A and B
def lenn(A, B):
     
    # Stores the result
    res = ""
    logg = 0
 
    while True:
 
        # 2 ^ logg <= B &&
        # 2 ^ (logg + 1) > B
        logg =log(B) // log(2)
 
        # Update res to
        # res+=A X 2^logg
        if (logg != 0):
            res += (str(A) + "<<" +
                    str(int(logg)))
        else:
 
            # Update res to res+=A X 2^0
            res += A
            break
 
        # Find the remainder
        B = B - pow(2, logg)
 
        # If remainder is not equal
        # to 0
        if (B != 0):
            res += "+"
        else:
            break
             
        if logg == 0:
            break
 
    # Return the resultant string
    return res
 
# Function to find the minimum
# length representation of A*B
def minimumString(A, B):
     
    # Find representation of form
    # A << k1 + A << k2 + ... + A << kn
    res1 = lenn(A, B)
 
    # Find representation of form
    # B << k1 + B << k2 + ... + B << kn
    res2 = lenn(B, A)
 
    # Compare the length of
    # the representations
    if (len(res1) > len(res2)):
        print(res2)
    else:
        print(res1)
 
# Driver Code
if __name__ == '__main__':
     
    # Product A X B
    A = 6
    B = 10
 
    # Function call
    minimumString(A, B)
 
# This code is contributed by mohit kumar 29

C#

// C# program for the above approach
using System;
 
class GFG{
 
// Function to find the string
// which evaluates to the
// product of A and B
public static string len(long A, long B)
{
     
    // Stores the result
    string res = "";
    long log = 0;
 
    do
    {
         
        // 2 ^ log <= B &&
        // 2 ^ (log + 1) > B
        log = (long)(Math.Log(B) /
                     Math.Log(2));
 
        // Update res to
        // res+=A X 2^log
        if (log != 0)
        {
            res += A + "<<" + log;
        }
        else
        {
             
            // Update res to res+=A X 2^0
            res += A;
            break;
        }
 
        // Find the remainder
        B = B - (long)Math.Pow(2, log);
 
        // If remainder is not equal
        // to 0
        if (B != 0)
        {
            res += "+";
        }
        else
            break;
    } while (log != 0);
 
    // Return the resultant string
    return res;
}
 
// Function to find the minimum
// length representation of A*B
public static void minimumString(long A,
                                 long B)
{
     
    // Find representation of form
    // A << k1 + A << k2 + ... + A << kn
    string res1 = len(A, B);
 
    // Find representation of form
    // B << k1 + B << k2 + ... + B << kn
    string res2 = len(B, A);
 
    // Compare the length of
    // the representations
    if (res1.Length > res2.Length)
    {
        Console.WriteLine(res2);
    }
    else
    {
        Console.WriteLine(res1);
    }
}
 
// Driver Code
public static void Main()
{
     
    // Product A X B
    long A = 6;
    long B = 10;
 
    // Function call
    minimumString(A, B);
}
}
 
// This code is contributed by code_hunt

Javascript

<script>
// Javascript program for
// the above approach
 
 
// Function to find the string
// which evaluates to the
// product of A and B
function len(A, B) {
    // Stores the result
    let res = "";
    let Log = 0;
 
    do {
        // 2 ^ log <= B &&
        // 2 ^ (log + 1) > B
        Log = Math.floor(Math.log(B) / Math.log(2));
 
        // Update res to
        // res+=A X 2^log
        if (Log != 0) {
            res = res + String(A) + "<<" + String(Log);
        }
        else {
            // Update res to
            // res+=A X 2^0
            res += A;
            break;
        }
 
        // Find the remainder
        B = B - Math.pow(2, Log);
 
        // If remainder is
        // not equal to 0
        if (B != 0) {
            res += "+";
        }
        else
            break;
    } while (Log != 0);
 
    // Return the
    // resultant string
    return res;
}
 
// Function to find the minimum
// length representation of A*B
function minimumString(A, B) {
    // Find representation of form
    // A << k1 + A << k2 + ... + A << kn
    let res1 = len(A, B);
 
    // Find representation of form
    // B << k1 + B << k2 + ... + B << kn
    let res2 = len(B, A);
 
    // Compare the length of
    // the representations
    if (res1.length > res2.length) {
        document.write(res2 + "<br>");
    }
    else {
        document.write(res1 + "<br>");
    }
}
 
// Driver code
 
 
// Product A X B
let A = 6;
let B = 10;
 
// Function Call
minimumString(A, B);
 
 
// This code is contributed by gfgking
</script>
Producción: 

6<<3+6<<1

Complejidad temporal: O(log N)
Espacio auxiliar: O(1)

Publicación traducida automáticamente

Artículo escrito por debarpan_bose_chowdhury y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *