Closest perfect square and its distance

Given a positive integer N. The task is to find the perfect square number closest to N and steps required to reach this number from N.

Note: The closest perfect square to N can be either less than, equal to or greater than N and steps is referred to the difference between N and the closest perfect square.

Examples:

Input: N = 1500
Output: Perfect square = 1521, Steps = 21
For N = 1500
Closest perfect square greater than N is 1521.
So steps required is 21.
Closest perfect square less than N is 1444.
So steps required is 56.
The minimum of these two is 1521 with steps 21.

Input: N = 2
Output: Perfect Square = 1, Steps = 1
For N = 2
Closest perfect square greater than N is 4.
So steps required is 2.
Closest perfect square less than N is 1.
So steps required is 1.
The minimum of these two is 1.



Approach:

  • If N is a perefct square then print N and steps as 0.
  • Else, find the first perfect square number > N and note its difference with N.
  • Then, find the first perfect square number < N and note its difference with N.
  • And print the perfect square resulting in the minimum of these two differences obtained and also the difference as the minimum steps.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// CPP program to find the closest perfect square
// taking minimum steps to reach from a number
  
#include<bits/stdc++.h>
using namespace std;
  
  
    // Function to check if a number is
    // perfect square or not
    bool isPerfect(int N)
    {
        if ((sqrt(N) - floor(sqrt(N))) != 0)
            return false;
        return true;
    }
  
    // Function to find the closest perfect square
    // taking minimum steps to reach from a number
    void getClosestPerfectSquare(int N)
    {
        if (isPerfect(N))
        {
            cout<<N<<" "<<"0"<<endl;
            return;
        }
  
        // Variables to store first perfect
        // square number
        // above and below N
        int aboveN = -1, belowN = -1;
        int n1;
  
        // Finding first perfect square
        // number greater than N
        n1 = N + 1;
        while (true) {
            if (isPerfect(n1)) {
                aboveN = n1;
                break;
            }
            else
                n1++;
        }
  
        // Finding first perfect square
        // number less than N
        n1 = N - 1;
        while (true) {
            if (isPerfect(n1)) {
                belowN = n1;
                break;
            }
            else
                n1--;
        }
  
        // Variables to store the differences
        int diff1 = aboveN - N;
        int diff2 = N - belowN;
  
        if (diff1 > diff2)
            cout<<belowN<<" "<<diff2;
        else
            cout<<aboveN<<" "<<diff1;
    }
  
    // Driver code
    int main()
    {
        int N = 1500;
  
        getClosestPerfectSquare(N);
    }
//This code is contributed by
// Surendra_Gangwar

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find the closest perfect square
// taking minimum steps to reach from a number
  
class GFG {
  
    // Function to check if a number is
    // perfect square or not
    static boolean isPerfect(int N)
    {
        if ((Math.sqrt(N) - Math.floor(Math.sqrt(N))) != 0)
            return false;
        return true;
    }
  
    // Function to find the closest perfect square
    // taking minimum steps to reach from a number
    static void getClosestPerfectSquare(int N)
    {
        if (isPerfect(N)) {
            System.out.println(N + " "
                               + "0");
            return;
        }
  
        // Variables to store first perfect
        // square number
        // above and below N
        int aboveN = -1, belowN = -1;
        int n1;
  
        // Finding first perfect square
        // number greater than N
        n1 = N + 1;
        while (true) {
            if (isPerfect(n1)) {
                aboveN = n1;
                break;
            }
            else
                n1++;
        }
  
        // Finding first perfect square
        // number less than N
        n1 = N - 1;
        while (true) {
            if (isPerfect(n1)) {
                belowN = n1;
                break;
            }
            else
                n1--;
        }
  
        // Variables to store the differences
        int diff1 = aboveN - N;
        int diff2 = N - belowN;
  
        if (diff1 > diff2)
            System.out.println(belowN + " " + diff2);
        else
            System.out.println(aboveN + " " + diff1);
    }
  
    // Driver code
    public static void main(String args[])
    {
        int N = 1500;
  
        getClosestPerfectSquare(N);
    }
}

chevron_right


Python3

# Python3 program to find the closest
# perfect square taking minimum steps
# to reach from a number

# Function to check if a number is
# perfect square or not
from math import sqrt, floor
def isPerfect(N):
if (sqrt(N) – floor(sqrt(N)) != 0):
return False
return True

# Function to find the closest perfect square
# taking minimum steps to reach from a number
def getClosestPerfectSquare(N):
if (isPerfect(N)):
print(N, “0”)
return

# Variables to store first perfect
# square number above and below N
aboveN = -1
belowN = -1
n1 = 0

# Finding first perfect square
# number greater than N
n1 = N + 1
while (True):
if (isPerfect(n1)):
aboveN = n1
break
else:
n1 += 1

# Finding first perfect square
# number less than N
n1 = N – 1
while (True):
if (isPerfect(n1)):
belowN = n1
break
else:
n1 -= 1

# Variables to store the differences
diff1 = aboveN – N
diff2 = N – belowN

if (diff1 > diff2):
print(belowN, diff2)
else:
print(aboveN, diff1)

# Driver code
N = 1500
getClosestPerfectSquare(N)

# This code is contributed
# by sahishelangia

C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to find the closest perfect square
// taking minimum steps to reach from a number
using System;
  
class GFG {
  
    // Function to check if a number is
    // perfect square or not
    static bool isPerfect(int N)
    {
        if ((Math.Sqrt(N) - Math.Floor(Math.Sqrt(N))) != 0)
            return false;
        return true;
    }
  
    // Function to find the closest perfect square
    // taking minimum steps to reach from a number
    static void getClosestPerfectSquare(int N)
    {
        if (isPerfect(N)) {
            Console.WriteLine(N + " "
                            + "0");
            return;
        }
  
        // Variables to store first perfect
        // square number
        // above and below N
        int aboveN = -1, belowN = -1;
        int n1;
  
        // Finding first perfect square
        // number greater than N
        n1 = N + 1;
        while (true) {
            if (isPerfect(n1)) {
                aboveN = n1;
                break;
            }
            else
                n1++;
        }
  
        // Finding first perfect square
        // number less than N
        n1 = N - 1;
        while (true) {
            if (isPerfect(n1)) {
                belowN = n1;
                break;
            }
            else
                n1--;
        }
  
        // Variables to store the differences
        int diff1 = aboveN - N;
        int diff2 = N - belowN;
  
        if (diff1 > diff2)
            Console.WriteLine(belowN + " " + diff2);
        else
            Console.WriteLine(aboveN + " " + diff1);
    }
  
    // Driver code
    public static void Main()
    {
        int N = 1500;
  
        getClosestPerfectSquare(N);
    }
}
// This code is contributed by anuj_67..

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP program to find the closest perfect 
// square taking minimum steps to reach 
// from a number
  
// Function to check if a number is
// perfect square or not
function isPerfect($N)
{
    if ((sqrt($N) - floor(sqrt($N))) != 0)
        return false;
    return true;
}
  
// Function to find the closest perfect square
// taking minimum steps to reach from a number
function getClosestPerfectSquare($N)
{
    if (isPerfect($N))
    {
        echo $N, " ", "0", "\n";
        return;
    }
  
    // Variables to store first perfect
    // square number
    // above and below N
    $aboveN = -1;
    $belowN = -1;
    $n1;
  
    // Finding first perfect square
    // number greater than N
    $n1 = $N + 1;
    while (true)
    {
        if (isPerfect($n1))
        {
            $aboveN = $n1;
            break;
        }
        else
            $n1++;
    }
  
    // Finding first perfect square
    // number less than N
    $n1 = $N - 1;
    while (true)
    {
        if (isPerfect($n1))
        {
            $belowN = $n1;
            break;
        }
        else
            $n1--;
    }
  
    // Variables to store the differences
    $diff1 = $aboveN - $N;
    $diff2 = $N - $belowN;
  
    if ($diff1 > $diff2)
        echo $belowN, " " , $diff2;
    else
        echo $aboveN, " ", $diff1;
}
  
// Driver code
$N = 1500;
getClosestPerfectSquare($N);
  
// This code is contributed by ajit.
?>

chevron_right


Output:

1521 21


My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.