Given three integers a, b, and x, the task is to get the multiple of x which is closest to ab.
Examples:
Input: a = 5, b = 4, x = 3
Output: 624
54 = 625 and 624 is the multiple of 3 which is closest to 625Input: a = 349, b = 1, x = 4
Output: 348
Approach:
- Calculate ab and store it in a variable say num.
- Then, calculate ?num / x? and store it in a variable floor.
- Now the closest element at the left will be closestLeft = x * floor.
- And the closest element on the right will be closestRight = x * (floor + 1).
- Finally, the closest number among them will be min(num - closestLeft, closestRight - num).
Below is the implementation of the above approach:
// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
#define ll long long int
// Function to return the multiple of x
// which is closest to a^b
ll getClosest(int a, int b, int x)
{
ll num = pow(a, b);
int floor = num / x;
// Closest element on the left
ll numOnLeft = x * floor;
// Closest element on the right
ll numOnRight = x * (floor + 1);
// If numOnLeft is closer than numOnRight
if ((num - numOnLeft) < (numOnRight - num))
return numOnLeft;
// If numOnRight is the closest
else
return numOnRight;
}
// Driver code
int main()
{
int a = 349, b = 1, x = 4;
cout << getClosest(a, b, x) << endl;
return 0;
}
//Java implementation of the approach
public class GFG {
// Function to return the multiple of x
// which is closest to a^b
static long getClosest(int a, int b, int x) {
long num = (long) Math.pow(a, b);
int floor = (int) (num / x);
// Closest element on the left
long numOnLeft = x * floor;
// Closest element on the right
long numOnRight = x * (floor + 1);
// If numOnLeft is closer than numOnRight
if ((num - numOnLeft) < (numOnRight - num)) {
return numOnLeft;
} // If numOnRight is the closest
else {
return numOnRight;
}
}
public static void main(String[] args) {
int a = 349, b = 1, x = 4;
System.out.println(getClosest(a, b, x));
}
}
# Python3 implementation of the approach
# Function to return the multiple of x
# which is closest to a^b
def getClosest(a, b, x) :
num = pow(a, b)
floor = num // x
# Closest element on the left
numOnLeft = x * floor
# Closest element on the right
numOnRight = x * (floor + 1)
# If numOnLeft is closer than numOnRight
if ((num - numOnLeft) <
(numOnRight - num)):
return numOnLeft
# If numOnRight is the closest
else :
return numOnRight
# Driver code
if __name__ == "__main__" :
a, b, x = 349, 1, 4
print(getClosest(a, b, x))
# This code is contributed by Ryuga
// C# implementation of the approach
using System;
// #define ll long long int
class GFG
{
// Function to return the multiple of x
// which is closest to a^b
static long getClosest(int a, int b, int x)
{
int num = (int)Math.Pow(a, b);
int floor = (int)(num / x);
// Closest element on the left
int numOnLeft = (int)(x * floor);
// Closest element on the right
int numOnRight = (int)(x * (floor + 1));
// If numOnLeft is closer than numOnRight
if ((num - numOnLeft) < (numOnRight - num))
return numOnLeft;
// If numOnRight is the closest
else
return numOnRight;
}
// Driver code
public static void Main()
{
int a = 349, b = 1, x = 4;
Console.WriteLine(getClosest(a, b, x));
}
}
// This code is contributed
// by Akanksha Rai
<?php
// PHP implementation of the above approach
// Function to return the multiple of x
// which is closest to a^b
function getClosest($a, $b, $x)
{
$num = pow($a, $b);
$floor = (int)($num / $x);
// Closest element on the left
$numOnLeft = $x * $floor;
// Closest element on the right
$numOnRight = $x * ($floor + 1);
// If numOnLeft is closer than numOnRight
if (($num - $numOnLeft) <
($numOnRight - $num))
return $numOnLeft;
// If numOnRight is the closest
else
return ceil($numOnRight);
}
// Driver code
$a = 349;
$b = 1;
$x = 4;
echo getClosest($a, $b, $x);
// This code is contributed by jit_t
?>
<script>
// Javascript implementation of the approach
// Function to return the multiple of x
// which is closest to a^b
function getClosest( a, b, x)
{
let num = Math.pow(a, b);
let floor = Math.floor(num / x);
// Closest element on the left
let numOnLeft = x * floor;
// Closest element on the right
let numOnRight = x * (floor + 1);
// If numOnLeft is closer than numOnRight
if ((num - numOnLeft) < (numOnRight - num))
return numOnLeft;
// If numOnRight is the closest
else
return numOnRight;
}
// Driver Code
let a = 349, b = 1, x = 4;
document.write(getClosest(a, b, x) + "</br>");
</script>
Output:
348
Time Complexity: O(log(b))
Auxiliary Space: O(1)