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

• Difficulty Level : Medium
• Last Updated : 22 Mar, 2022

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``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 ``/``/` `i ` `            ``# 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

 ``

Output:

`1`

Time complexity: O(sqrt(N))

Auxiliary Space: O(1)

My Personal Notes arrow_drop_up