给定一个正整数N。查找给定数字的最大除数,该除数不能被大于1的完美平方除以。
例子:
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
一种简单的方法是通过迭代到N的平方根来查找给定数字N的所有除数,并将它们按排序顺序(降序)保留在列表中。在这里,我们将它们按降序插入到集合中以保持它们的排序。另外,通过从1到10 5进行迭代,列出直至10 10的所有理想平方。
现在,对于从最大的除数开始的每个除数,请检查其是否可以被列表中的任何理想平方整除。如果除数不能被任何完美数整除,只需将其返回为答案即可。
下面是上述方法的实现。
C++
// C++ 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 > 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 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;
}
Java
// Java Program to find the largest
// divisor not divisible by any
// perfect square greater than 1
import java.util.*;
class Main{
static int MAX = (int)1e5;
// Function to find the largest
// divisor not divisible by any
// perfect square greater than 1
public static int findLargestDivisor(int n)
{
// set to store divisors in
// descending order
int m = n;
Set s =
new HashSet();
s.add(1);
s.add(n);
for (int i = 2;
i < (int)Math.sqrt(n) + 1; i++)
{
// 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);
List l =
new ArrayList(s);
Collections.sort(l);
Collections.reverse(l);
// Vector to store
// perfect squares
Vector vec =
new Vector();
for (int i = 2; i <= MAX; i++)
vec.add(i * i);
// Check for each divisor, if
// it is not divisible by any
// perfect square, simply return
// it as the answer.
for (int d : l)
{
int divi = 0;
for (int j = 0;
j < vec.size() &&
vec.get(j) <= d; j++)
{
if (d % vec.get(j) == 0)
{
divi = 1;
break;
}
}
if (divi == 0)
return d;
}
return 0;
}
// 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 divyeshrabadiya07
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
C#
// C# program to find the largest
// divisor not divisible by any
// perfect square greater than 1
using System;
using System.Collections.Generic;
class GFG{
static int MAX = (int)1e5;
// Function to find the largest
// divisor not divisible by any
// perfect square greater than 1
static int findLargestDivisor(int n)
{
// Set to store divisors in
// descending order
int m = n;
HashSet s = new HashSet();
s.Add(1);
s.Add(n);
for(int i = 2;
i < (int)Math.Sqrt(n) + 1;
i++)
{
// 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);
List l = new List(s);
l.Sort();
l.Reverse();
// Vector to store
// perfect squares
List vec = new List();
for(int i = 2; i <= MAX; i++)
vec.Add(i * i);
// Check for each divisor, if
// it is not divisible by any
// perfect square, simply return
// it as the answer.
foreach(int d in l)
{
int divi = 0;
for(int j = 0;
j < vec.Count && vec[j] <= d;
j++)
{
if (d % vec[j] == 0)
{
divi = 1;
break;
}
}
if (divi == 0)
return d;
}
return 0;
}
// Driver code
static void Main()
{
int n = 12;
Console.WriteLine(findLargestDivisor(n));
n = 97;
Console.WriteLine(findLargestDivisor(n));
}
}
// This code is contributed by divyesh072019
C++
// Efficient C++ 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 Python3 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
Javascript
输出:
6
97
一种有效的方法是为每个i除以n,以便(i * i)除n。
C++
// Efficient C++ 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 Python3 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
Java脚本
输出:
6
97