给定整数a , b , N ,任务是找到最大数x ,使得是基数b的N位数字。
例子:
Input: a = 2, b = 10, N = 2
Output: 3
Explanation:
Here 2 * 33 = 54, which has number of digit = 2,
but 2 * 44 = 512 which has number of digits = 3, which is not equal to N.
Therefore the largest value of x is 2.
Input: a = 1, b = 2, N = 3
Output: 2
Explanation:
1 * 22 = 4 whose binary representation is 100 and it has 3 digits.
方法:可以使用二进制搜索解决此问题。
- 的位数在基地是 。
- 二进制搜索用于查找最大的这样的数字在基地正是 。
- 在二进制搜索中,我们将检查位数 , 在哪里 ,并据此更改指针。
下面是上述方法的实现:
C++
// C++ implementation of the above approach
#include
using namespace std;
// Function to find log_b(a)
double log(int a, int b)
{
return log10(a) / log10(b);
}
int get(int a, int b, int n)
{
// Set two pointer for binary search
int lo = 0, hi = 1e6;
int ans = 0;
while (lo <= hi) {
int mid = (lo + hi) / 2;
// Calculating number of digits
// of a*mid^mid in base b
int dig = ceil((mid * log(mid, b)
+ log(a, b)));
if (dig > n) {
// If number of digits > n
// we can simply ignore it
// and decrease our pointer
hi = mid - 1;
}
else {
// if number of digits <= n,
// we can go higher to
// reach value exactly equal to n
ans = mid;
lo = mid + 1;
}
}
// return the largest value of x
return ans;
}
// Driver Code
int main()
{
int a = 2, b = 2, n = 6;
cout << get(a, b, n)
<< "\n";
return 0;
}
Java
// Java implementation of the above approach
import java.util.*;
class GFG{
// Function to find log_b(a)
static int log(int a, int b)
{
return (int)(Math.log10(a) /
Math.log10(b));
}
static int get(int a, int b, int n)
{
// Set two pointer for binary search
int lo = 0, hi = (int) 1e6;
int ans = 0;
while (lo <= hi)
{
int mid = (lo + hi) / 2;
// Calculating number of digits
// of a*mid^mid in base b
int dig = (int) Math.ceil((mid * log(mid, b) +
log(a, b)));
if (dig > n)
{
// If number of digits > n
// we can simply ignore it
// and decrease our pointer
hi = mid - 1;
}
else
{
// If number of digits <= n,
// we can go higher to reach
// value exactly equal to n
ans = mid;
lo = mid + 1;
}
}
// Return the largest value of x
return ans;
}
// Driver Code
public static void main(String[] args)
{
int a = 2, b = 2, n = 6;
System.out.print(get(a, b, n) + "\n");
}
}
// This code is contributed by amal kumar choubey
Python3
# Python3 implementation of the above approach
from math import log10,ceil,log
# Function to find log_b(a)
def log1(a,b):
return log10(a)//log10(b)
def get(a,b,n):
# Set two pointer for binary search
lo = 0
hi = 1e6
ans = 0
while (lo <= hi):
mid = (lo + hi) // 2
# Calculating number of digits
# of a*mid^mid in base b
dig = ceil((mid * log(mid, b) + log(a, b)))
if (dig > n):
# If number of digits > n
# we can simply ignore it
# and decrease our pointer
hi = mid - 1
else:
# if number of digits <= n,
# we can go higher to
# reach value exactly equal to n
ans = mid
lo = mid + 1
# return the largest value of x
return ans
# Driver Code
if __name__ == '__main__':
a = 2
b = 2
n = 6
print(int(get(a, b, n)))
# This code is contributed by Surendra_Gangwar
C#
// C# implementation of the above approach
using System;
class GFG{
// Function to find log_b(a)
static int log(int a, int b)
{
return (int)(Math.Log10(a) /
Math.Log10(b));
}
static int get(int a, int b, int n)
{
// Set two pointer for binary search
int lo = 0, hi = (int) 1e6;
int ans = 0;
while (lo <= hi)
{
int mid = (lo + hi) / 2;
// Calculating number of digits
// of a*mid^mid in base b
int dig = (int)Math.Ceiling((double)(mid *
log(mid, b) +
log(a, b)));
if (dig > n)
{
// If number of digits > n
// we can simply ignore it
// and decrease our pointer
hi = mid - 1;
}
else
{
// If number of digits <= n,
// we can go higher to reach
// value exactly equal to n
ans = mid;
lo = mid + 1;
}
}
// Return the largest value of x
return ans;
}
// Driver Code
public static void Main(String[] args)
{
int a = 2, b = 2, n = 6;
Console.Write(get(a, b, n) + "\n");
}
}
// This code is contributed by amal kumar choubey
输出:
3