给定两个数字A和B ,任务是打印最小长度的字符串,该字符串的值等于两个给定数字A * B的乘积,而不使用乘法符号。
Any perfect power of 2 can be expressed in the form of a left-shift operator.
For Example:
N = 2 = 1<<1 = “<<1”
N = 4 = 1<<2 = “<<2”
Using the above idea, any number can be expressed using a left-shift operator instead of a multiplication sign.
For Example:
N = 24 = 6*4 = 6(1<<2) = “6<<2”
例子:
Input: A = 6, B = 10
Output: 6<<3+6<<1
Explanation:
Product of the 2 numbers = 6 × 10 = 60.
The above-given expression evaluates to 6 × (2 × 2 × 2) + 6 × 2 = 60.
The string “10<<2+10<<1” also evaluates to 60.
But “6<<3+6<<1” is the required output as its length is smaller.
Input: A = 5, B = 5
Output: 5<<2+5
Explanation:
Product of the 2 numbers = 5 × 5 = 25.
The above-given expression evaluates to 5 × (2 × 2) + 5 = 25.
方法:想法是使用Left Shift Operator查找产品。步骤如下:
- 将B表示为2的幂。
Let B = 2k1 + 2k2 + … + 2kn, where k1 > k2 > .. > kn
- 因此,A和B的乘积可以写成
A * B = A * (2k1 + 2k2+ … + 2kn )
- 使用“ <<” (左移位运算符)将数字乘以2的任意幂。
- 因此,A x B = A << k 1 + A << k 2 +…+ A << k n
- 要找到k i,我们使用log()函数并使用余数B – 2 k i继续该过程,直到余数变为0或余数的对数变为零。
- 类似地,通过将A表示为2的幂,表示A * B = B << k 1 + B << k 2 +…+ B << k n
- 比较这两种表示形式,并以较小的长度打印字符串。
下面是上述方法的实现:
C++
// C++ program for
// the above approach
#include
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
# lenngth 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 lenngth 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
6<<3+6<<1
时间复杂度: O(log N)
辅助空间: O(1)