Skip to content
Related Articles

Related Articles

Improve Article
Save Article
Like Article

Find smallest perfect square number A such that N + A is also a perfect square number

  • Difficulty Level : Medium
  • Last Updated : 23 Mar, 2021

Given a positive number N. The task is to find out the smallest perfect square number A such that N + A is also a perfect square number or return -1.
Examples: 
 

Input: N = 3
Output: 1
Explanation: 
As 1 + 3 = 4 = 22

Input: N=1
Output: -1

 

Naive Approach: 
Traverse M from {1, 2, 3, 4, 5…} and check whether (N + M * M) is a perfect square number or not.
Efficient Approach: 
 

  • On observing, we have an equation like: 
     
  • N + (X * X) = (M * M) where N is given and M and X are unknown.
  • We can rearrange it and get: 
    • N = (M * M) – (X * X)
    • N = (M + X) * (M – X)
  •  
  • Now we can see that for obtaining N, we need to find the factor of N.The factor of N can be obtained in O(N) time. But it can be optimized to O(N^1/2) by this method. 
     
  • Let the factor of N be a and b = (N / a). So, from the above equation a = (M – X) and b = (M + X), and after solving this we can obtain the value of X = (b – a)/2
     

Below is the implementation of the above approach: 
 

C++




// C++ code to find out the smallest
// perfect square X which when added to N
// yields another perfect square number.
#include<bits/stdc++.h>
using namespace std;
 
long SmallestPerfectSquare(long N){
     
    // X is the smallest perfect
    // square number
    long X = (long)1e9;
    long ans;
     
    // Loop from 1 to square root of N
    for(int i = 1; i < sqrt(N); i++)
    {
     
        // Condition to check whether i
        // is factor of N or not
        if (N % i == 0)
        {
            long a = i;
            long b = N / i;
     
            // Condition to check whether
            // factors satisfies the
            // equation or not
            if((b - a != 0) && ((b - a) % 2 == 0))
            {
                         
                // Stores minimum value
                X = min(X, (b - a) / 2);
            }
        }
    }
     
    // Return if X * X if X is not equal
    // to 1e9 else return -1
    if (X != 1e9)
        ans = X * X;
    else
        ans = -1;
             
    return ans;
}
     
// Driver code
int main()
{
    long N = 3;
    cout << SmallestPerfectSquare(N);
    return 0;
}
 
// This code is contributed by AnkitRai01

Java




// Java code to find out the smallest
// perfect square X which when added to N
// yields another perfect square number.
 
public class GFG {
     
 
    static long SmallestPerfectSquare(long N)
    {
     
        // X is the smallest perfect
        // square number
        long X = (long)1e9;
        long ans;
     
        // Loop from 1 to square root of N
        for(int i = 1; i < Math.sqrt(N); i++){
     
            // Condition to check whether i
            // is factor of N or not
            if (N % i == 0){
                long a = i ;
                long b = N / i;
     
                // Condition to check whether
                // factors satisfies the
                // equation or not
                if ((b - a != 0) && ((b - a) % 2 == 0)){
                         
                    // Stores minimum value
                    X = Math.min(X, (b - a) / 2) ;
                }
            }
        }
     
        // Return if X * X if X is not equal
        // to 1e9 else return -1
        if (X != 1e9)
            ans = X * X;
        else
            ans = -1;
             
        return ans;
    }
     
    // Driver code
    public static void main (String[] args){
        long N = 3;
         
        System.out.println(SmallestPerfectSquare(N)) ;
     
        }
}
// This code is contributed by AnkitRai01

Python3




# Python3 code to find out the smallest
# perfect square X which when added to N
# yields another perfect square number.
import math
def SmallestPerfectSquare(N):
 
    # X is the smallest perfect
    # square number
    X = 1e9
 
    # Loop from 1 to square root of N
    for i in range(1, int(math.sqrt(N)) + 1):
 
        # Condition to check whether i
        # is factor of N or not
        if N % i == 0:
            a = i
            b = N //
 
            # Condition to check whether 
            # factors satisfies the
            # equation or not
            if b - a != 0 and (b - a) % 2 == 0:
                    
                # Stores minimum value
                 X = min(X, (b - a) // 2)
 
    # Return if X * X if X is not equal
    # to 1e9 else return -1
    return(X * X if X != 1e9 else -1)
 
# Driver code
if __name__ == "__main__"
   
    N = 3
   
    print(SmallestPerfectSquare(N))

C#




// C# code to find out the smallest
// perfect square X which when added to N
// yields another perfect square number.
using System;
 
class GFG {
     
    static long SmallestPerfectSquare(long N)
    {
        // X is the smallest perfect
        // square number
        long X = (long)1e9;
        long ans;
     
        // Loop from 1 to square root of N
        for(int i = 1; i < Math.Sqrt(N); i++){
     
            // Condition to check whether i
            // is factor of N or not
            if (N % i == 0)
            {
                long a = i;
                long b = N / i;
     
                // Condition to check whether
                // factors satisfies the
                // equation or not
                if ((b - a != 0) && ((b - a) % 2 == 0))
                {
                    // Stores minimum value
                    X = Math.Min(X, (b - a) / 2);
                }
            }
        }
     
        // Return if X*X if X is not equal
        // to 1e9 else return -1
        if (X != 1e9)
            ans = X * X;
        else
            ans = -1;
             
        return ans;
    }
     
    // Driver code
    public static void Main (string[] args)
    {
        long N = 3;
        Console.WriteLine(SmallestPerfectSquare(N));
    }
}
 
// This code is contributed by AnkitRai01

Javascript




<script>
 
// JavaScript code to find out the smallest
// perfect square X which when added to N
// yields another perfect square number. 
 
function SmallestPerfectSquare(N){
     
    // X is the smallest perfect
    // square number
    let X = 1e9;
    let ans;
     
    // Loop from 1 to square root of N
    for(let i = 1; i < Math.sqrt(N); i++)
    {
     
        // Condition to check whether i
        // is factor of N or not
        if (N % i == 0)
        {
            let a = i;
            let b = N / i;
     
            // Condition to check whether
            // factors satisfies the
            // equation or not
            if((b - a != 0) && ((b - a) % 2 == 0))
            {
                         
                // Stores minimum value
                X = Math.min(X, (b - a) / 2);
            }
        }
    }
     
    // Return if X * X if X is not equal
    // to 1e9 else return -1
    if (X != 1e9)
        ans = X * X;
    else
        ans = -1;
             
    return ans;
}
     
// Driver code
 
    let N = 3;
    document.write(SmallestPerfectSquare(N)); 
 
// This code is contributed by Surbhi Tyagi.
 
</script>
Output: 
1

 

Time complexity: sqrt(N)
 


My Personal Notes arrow_drop_up
Recommended Articles
Page :

Start Your Coding Journey Now!