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:
- Representa B como potencias de 2 .
Sea B = 2 k 1 + 2 k 2 + … + 2 k n , donde k 1 > k 2 > .. > k n
- 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>
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