# Largest Divisor of a Number not divisible by a perfect square

Given a positive integer N. Find the largest divisor of the given number that is not divisible by a perfect square greater than 1.

Examples:

```Input : 12
Output : 6
Explanation : Divisors of 12 are 1, 2, 3, 4, 6 and 12.
Since 12 is divisible by 4 (a perfect square),
it can't be required divisor. 6 is not divisible
by any perfect square.

Input :97
Output :97
```

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

A simple approach is to find all the divisors of the given number N by iterating upto square root of N and keep them in sorted order(Descending) in a list. Here we are inserting them in a set in descending order to keep them sorted. Also, make a list of all perfect squares upto 1010 by iterating from 1 to 105.

Now for each divisor starting from the greatest one check whether it is divisible by any perfect square in the list or not. If a divisor is not divisible by any perfect, simply return it as the answer.

Below is the implementation of the above approach.

## C++

 `// CPP Program to find the largest ` `// divisor not divisible by any ` `// perfect square greater than 1 ` `#include ` `using` `namespace` `std; ` ` `  `const` `int` `MAX = 1e5; ` ` `  `// Function to find the largest ` `// divisor not divisible by any ` `// perfect square greater than 1 ` `int` `findLargestDivisor(``int` `n) ` `{ ` `    ``// set to store divisors in ` `    ``// descending order ` `    ``int` `m = n; ` `    ``set<``int``, greater<``int``> > s; ` `    ``s.insert(1); ` `    ``s.insert(n); ` ` `  `    ``for` `(``int` `i = 2; i < ``sqrt``(n) + 1; i++) { ` `        ``// If the number is divisible ` `        ``// by i, then insert it ` `        ``if` `(n % i == 0) { ` `            ``s.insert(n / i); ` `            ``s.insert(i); ` `            ``while` `(m % i == 0) ` `                ``m /= i; ` `        ``} ` `    ``} ` ` `  `    ``if` `(m > 1) ` `        ``s.insert(m); ` ` `  `    ``// Vector to store perfect squares ` `    ``vector<``int``> vec; ` `    ``for` `(``int` `i = 2; i <= MAX; i++) ` `        ``vec.push_back(i * i); ` ` `  `    ``// Check for each divisor, if it is not ` `    ``// divisible by any perfect square, ` `    ``// simply return it as the answer. ` `    ``for` `(``auto` `d : s) { ` `        ``int` `divi = 0; ` `        ``for` `(``int` `j = 0; j < vec.size() ` `                        ``&& vec[j] <= d; ` `             ``j++) { ` `            ``if` `(d % vec[j] == 0) { ` `                ``divi = 1; ` `                ``break``; ` `            ``} ` `        ``} ` `        ``if` `(!divi) ` `            ``return` `d; ` `    ``} ` `} ` ` `  `// Driver Code ` `int` `main() ` `{ ` `    ``int` `n = 12; ` `    ``cout << findLargestDivisor(n) << endl; ` ` `  `    ``n = 97; ` `    ``cout << findLargestDivisor(n) << endl; ` `    ``return` `0; ` `} `

## Python3

 `# Python3 Program to find the largest  ` `# divisor not divisible by any  ` `# perfect square greater than 1  ` ` `  `MAX` `=` `10` `*``*` `5` ` `  `# Function to find the largest  ` `# divisor not divisible by any  ` `# perfect square greater than 1  ` `def` `findLargestDivisor(n):  ` ` `  `    ``# set to store divisors in  ` `    ``# descending order  ` `    ``m ``=` `n  ` `    ``s ``=` `set``()  ` `    ``s.add(``1``)  ` `    ``s.add(n)  ` ` `  `    ``for` `i ``in` `range``(``2``, ``int``(n ``*``*` `(``0.5``)) ``+` `1``):  ` `         `  `        ``# If the number is divisible  ` `        ``# by i, then insert it  ` `        ``if` `n ``%` `i ``=``=` `0``: ` `            ``s.add(n ``/``/` `i)  ` `            ``s.add(i)  ` `            ``while` `m ``%` `i ``=``=` `0``:  ` `                ``m ``/``/``=` `i  ` `         `  `    ``if` `m > ``1``:  ` `        ``s.add(m)  ` ` `  `    ``# Vector to store perfect squares  ` `    ``vec ``=` `[i``*``*``2` `for` `i ``in` `range``(``2``, ``MAX` `+` `1``)]  ` ` `  `    ``# Check for each divisor, if it is not  ` `    ``# divisible by any perfect square,  ` `    ``# simply return it as the answer.  ` `    ``for` `d ``in` `sorted``(s, reverse ``=` `True``): ` `         `  `        ``divi, j ``=` `0``, ``0` `        ``while` `j < ``len``(vec) ``and` `vec[j] <``=` `d:  ` ` `  `            ``if` `d ``%` `vec[j] ``=``=` `0``:  ` `                ``divi ``=` `1` `                ``break` `            ``j ``+``=` `1`         `         `  `        ``if` `not` `divi: ` `            ``return` `d  ` ` `  `# Driver Code  ` `if` `__name__ ``=``=` `"__main__"``: ` ` `  `    ``n ``=` `12` `    ``print``(findLargestDivisor(n))  ` ` `  `    ``n ``=` `97` `    ``print``(findLargestDivisor(n))  ` `     `  `# This code is contributed by Rituraj Jain `

Output:

```6
97
```

An efficient approach is to divide n by i for every i such that (i * i) divides n.

## C++

 `// Efficient CPP Program to find the  ` `// largest divisor not divisible by any ` `// perfect square greater than 1 ` `#include ` `using` `namespace` `std; ` `  `  `// Function to find the largest ` `// divisor not divisible by any ` `// perfect square greater than 1 ` `int` `findLargestDivisor(``int` `n) ` `{ ` `    ``for` `(``int` `i = 2; i < ``sqrt``(n) + 1; i++) { ` `         `  `        ``// If the number is divisible ` `        ``// by i*i, then remove one i ` `        ``while` `(n % (i * i) == 0) { ` `            ``n = n / i; ` `        ``} ` `    ``} ` `   `  `    ``// Now all squares are removed from n ` `    ``return` `n;     ` `} ` `  `  `// Driver Code ` `int` `main() ` `{ ` `    ``int` `n = 12; ` `    ``cout << findLargestDivisor(n) << endl; ` `  `  `    ``n = 97; ` `    ``cout << findLargestDivisor(n) << endl; ` `    ``return` `0; ` `} `

## Java

 `// Efficient Java Program to find the  ` `// largest divisor not divisible by any  ` `// perfect square greater than 1  ` ` `  `public` `class` `GFG ` `{ ` ` `  `    ``// Function to find the largest  ` `    ``// divisor not divisible by any  ` `    ``// perfect square greater than 1  ` `    ``static` `int` `findLargestDivisor(``int` `n)  ` `    ``{  ` `        ``for` `(``int` `i = ``2``; i < Math.sqrt(n) + ``1``; i++) {  ` `             `  `            ``// If the number is divisible  ` `            ``// by i*i, then remove one i  ` `            ``while` `(n % (i * i) == ``0``) {  ` `                ``n = n / i;  ` `            ``}  ` `        ``}  ` `         `  `        ``// Now all squares are removed from n  ` `        ``return` `n;      ` `    ``}  ` `     `  `    ``// Driver Code  ` `    ``public` `static` `void` `main(String args[])  ` `    ``{  ` `        ``int` `n = ``12``;  ` `        ``System.out.println(findLargestDivisor(n)) ; ` `     `  `        ``n = ``97``;  ` `        ``System.out.println(findLargestDivisor(n)) ; ` `     `  `    ``}  ` `    ``// This code is contributed ` `    ``// by Ryuga ` `} `

## Python3

 `# Efficient CPP Program to find the  ` `# largest divisor not divisible by any ` `# perfect square greater than 1 ` `import` `math ` ` `  `# Function to find the largest ` `# divisor not divisible by any ` `# perfect square greater than 1 ` `def` `findLargestDivisor( n): ` ` `  `    ``for` `i ``in` `range` `(``2``, ``int``(math.sqrt(n)) ``+` `1``) :  ` `         `  `        ``# If the number is divisible ` `        ``# by i*i, then remove one i ` `        ``while` `(n ``%` `(i ``*` `i) ``=``=` `0``) : ` `            ``n ``=` `n ``/``/` `i ` `     `  `    ``# Now all squares are removed from n ` `    ``return` `n ` ` `  `# Driver Code ` `if` `__name__ ``=``=` `"__main__"``: ` ` `  `    ``n ``=` `12` `    ``print` `(findLargestDivisor(n)) ` ` `  `    ``n ``=` `97` `    ``print` `(findLargestDivisor(n)) ` ` `  `# This code is contributed by ita_c `

## C#

 `// Efficient C# Program to find the  ` `// largest divisor not divisible by any  ` `// perfect square greater than 1  ` `using` `System; ` `public` `class` `GFG ` `{ ` ` `  `    ``// Function to find the largest  ` `    ``// divisor not divisible by any  ` `    ``// perfect square greater than 1  ` `    ``static` `int` `findLargestDivisor(``int` `n)  ` `    ``{  ` `        ``for` `(``int` `i = 2; i < Math.Sqrt(n) + 1; i++) {  ` `             `  `            ``// If the number is divisible  ` `            ``// by i*i, then remove one i  ` `            ``while` `(n % (i * i) == 0) {  ` `                ``n = n / i;  ` `            ``}  ` `        ``}  ` `         `  `        ``// Now all squares are removed from n  ` `        ``return` `n;      ` `    ``}  ` `     `  `    ``// Driver Code  ` `    ``public` `static` `void` `Main()  ` `    ``{  ` `        ``int` `n = 12;  ` `        ``Console.WriteLine(findLargestDivisor(n)) ; ` `     `  `        ``n = 97;  ` `        ``Console.WriteLine(findLargestDivisor(n)) ; ` `     `  `    ``}  ` `} ` `    ``// This code is contributed ` `    ``// by Mukul Singh `

## PHP

 ` `

Output:

```6
97
```

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

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.