logo

Pary liczb polubownych

Liczby polubowne to pary dwóch liczb całkowitych (a b) takie, że:

  • Suma właściwych dzielników a = b I Suma właściwych dzielników b = a

gdzie a ≠ b.

Przykłady: (220284)



  • Właściwe dzielniki liczby 220: 1 2 4 5 10 11 20 22 44 55 110
    • Suma = 1 + 2 + 4 + 5 + 10 + 11 + 20 + 22 + 44 + 55 + 110 = 284
  • Właściwe dzielniki liczby 284: 1 2 4 71 142
    • Suma = 1 + 2 + 4 + 71 + 142 = 220

Zatem (220 284) jest parą liczb polubownych.

Niektóre inne przykłady obejmują:

  • (1184 1210)
  • (2620 2924)
  • (5020 5564)
  • (6232 6368)

Przykład:

Input : arr[] = {220 284 1184 1210 2 5}  
Output : 2
Explanation : (220 284) and (1184 1210) form amicable pair.

Input : arr[] = {2620 2924 5020 5564 6232 6368}
Output : 3
Explanation : (2620 2924) (5020 5564) and (6232 6368) forms amicable pair.

A proste rozwiązanie polega na przejrzeniu każdej pary i sprawdzeniu, czy tworzą polubowną parę, jeśli tak, zwiększamy liczbę. 

Realizacja:

C++
// A simple C++ program to count  // amicable pairs in an array. #include    using namespace std; // Calculate the sum // of proper divisors int sumOfDiv(int x) {  // 1 is a proper divisor  int sum = 1;  for (int i = 2; i <= sqrt(x); i++)   {  if (x % i == 0)   {  sum += i;  // To handle perfect squares  if (x / i != i)  sum += x / i;  }  }  return sum; } // Check if pair is amicable bool isAmicable(int a int b) {  return (sumOfDiv(a) == b &&   sumOfDiv(b) == a); } // This function prints pair  // of amicable pairs present  // in the input array int countPairs(int arr[] int n) {  int count = 0;  // Iterate through each   // pair and find if it  // an amicable pair  for (int i = 0; i < n; i++)  for (int j = i + 1; j < n; j++)  if (isAmicable(arr[i] arr[j]))  count++;  return count; } // Driver code int main() {  int arr1[] = { 220 284 1184   1210 2 5 };  int n1 = sizeof(arr1) / sizeof(arr1[0]);  cout << countPairs(arr1 n1)   << endl;  int arr2[] = { 2620 2924 5020   5564 6232 6368 };  int n2 = sizeof(arr2) / sizeof(arr2[0]);  cout << countPairs(arr2 n2);  return 0; } 
Java
// A simple Java program to count // amicable pairs in an array. import java.io.*; class GFG  {  // Calculate the sum   // of proper divisors  static int sumOfDiv(int x)  {  // 1 is a proper divisor  int sum = 1;  for (int i = 2; i <= Math.sqrt(x); i++)   {  if (x % i == 0)   {  sum += i;  // To handle perfect squares  if (x / i != i)  sum += x / i;  }  }  return sum;  }  // Check if pair is amicable  static boolean isAmicable(int a int b)  {  return (sumOfDiv(a) == b &&   sumOfDiv(b) == a);  }  // This function prints pair  // of amicable pairs present  // in the input array  static int countPairs(int arr[] int n)  {  int count = 0;  // Iterate through each pair   // and find if it an amicable pair  for (int i = 0; i < n; i++)  for (int j = i + 1; j < n; j++)  if (isAmicable(arr[i] arr[j]))  count++;  return count;  }  // Driver code  public static void main(String args[])  {  int arr1[] = { 220 284 1184   1210 2 5 };  int n1 = arr1.length;  System.out.println(countPairs(arr1 n1));  int arr2[] = { 2620 2924 5020  5564 6232 6368 };  int n2 = arr2.length;  System.out.println(countPairs(arr2 n2));  } } // This code is contributed by Anshika Goyal. 
Python
# Python3 program to count  # amicable pairs in an array # Calculate the sum  # of proper divisors def sumOfDiv(x): sum = 1 for i in range(2 x): if x % i == 0: sum += i return sum # Check if pair is amicable def isAmicable(a b): if sumOfDiv(a) == b and sumOfDiv(b) == a: return True else: return False # This function prints pair  # of amicable pairs present  # in the input array def countPairs(arr n): count = 0 for i in range(0 n): for j in range(i + 1 n): if isAmicable(arr[i] arr[j]): count = count + 1 return count # Driver Code arr1 = [220 284 1184 1210 2 5] n1 = len(arr1) print(countPairs(arr1 n1)) arr2 = [2620 2924 5020 5564 6232 6368] n2 = len(arr2) print(countPairs(arr2 n2)) # This code is contributed  # by Smitha Dinesh Semwal 
C#
// A simple C# program to count  // amicable pairs in an array. using System; class GFG  {    // Calculate the sum  // of proper divisors  static int sumOfDiv(int x)  {    // 1 is a proper divisor  int sum = 1;  for (int i = 2; i <= Math.Sqrt(x); i++)   {  if (x % i == 0)   {  sum += i;  // To handle perfect squares  if (x / i != i)  sum += x / i;  }  }    return sum;  }  // Check if pair is amicable  static bool isAmicable(int a int b)  {  return (sumOfDiv(a) == b &&  sumOfDiv(b) == a);  }  // This function prints pair  // of amicable pairs present   // in the input array  static int countPairs(int []arr int n)  {  int count = 0;  // Iterate through each pair   // and find if it an amicable pair  for (int i = 0; i < n; i++)    for (int j = i + 1; j < n; j++)  if (isAmicable(arr[i] arr[j]))  count++;  return count;  }  // Driver code  public static void Main()   {  int []arr1 = {220 284 1184   1210 2 5};  int n1 = arr1.Length;    Console.WriteLine(countPairs(arr1 n1));  int []arr2 = {2620 2924 5020   5564 6232 6368};  int n2 = arr2.Length;  Console.WriteLine(countPairs(arr2 n2));  } } // This code is contributed by vt_m. 
JavaScript
<script>  // A simple Javascript program to count   // amicable pairs in an array.    // Calculate the sum  // of proper divisors  function sumOfDiv(x)  {    // 1 is a proper divisor  let sum = 1;  for (let i = 2; i <= Math.sqrt(x); i++)   {  if (x % i == 0)   {  sum += i;    // To handle perfect squares  if (parseInt(x / i 10) != i)  sum += parseInt(x / i 10);  }  }    return sum;  }    // Check if pair is amicable  function isAmicable(a b)  {  return (sumOfDiv(a) == b &&  sumOfDiv(b) == a);  }    // This function prints pair  // of amicable pairs present   // in the input array  function countPairs(arr n)  {  let count = 0;    // Iterate through each pair   // and find if it an amicable pair  for (let i = 0; i < n; i++)    for (let j = i + 1; j < n; j++)  if (isAmicable(arr[i] arr[j]))  count++;    return count;  }    let arr1 = [220 284 1184 1210 2 5];  let n1 = arr1.length;  document.write(countPairs(arr1 n1) + '
'
); let arr2 = [2620 2924 5020 5564 6232 6368]; let n2 = arr2.length; document.write(countPairs(arr2 n2)); </script>
PHP
 // A simple PHP program to count  // amicable pairs in an array. // Calculate the sum  // of proper divisors function sumOfDiv( $x) { // 1 is a proper divisor $sum = 1; for ( $i = 2; $i <= sqrt($x); $i++) { if ($x % $i == 0) { $sum += $i; // To handle perfect squares if ($x / $i != $i) $sum += $x / $i; } } return $sum; } // Check if pair is amicable function isAmicable( $a $b) { return (sumOfDiv($a) == $b and sumOfDiv($b) == $a); } // This function prints pair  // of amicable pairs present  // in the input array function countPairs( $arr $n) { $count = 0; // Iterate through each pair  // and find if it an amicable pair for ( $i = 0; $i < $n; $i++) for ( $j = $i + 1; $j < $n; $j++) if (isAmicable($arr[$i] $arr[$j])) $count++; return $count; } // Driver code $arr1 = array( 220 284 1184 1210 2 5 ); $n1 = count($arr1); echo countPairs($arr1 $n1)'n'; $arr2 = array( 2620 2924 5020 5564 6232 6368 ); $n2 = count($arr2); echo countPairs($arr2 $n2); // This code is contributed by anuj_67. ?> 

Wyjście
2 3

Jakiś wydajne rozwiązanie polega na przechowywaniu liczb na mapie i dla każdej liczby znajdujemy sumę jej właściwego dzielnika i sprawdzamy, czy jest on również obecny w tablicy. Jeśli jest obecny, możemy sprawdzić, czy tworzą przyjazną parę, czy nie.

W ten sposób złożoność zostałaby znacznie zmniejszona. Poniżej znajduje się program C++ do tego samego. 

Realizacja:

C++
// Efficient C++ program to count  // Amicable pairs in an array. #include    using namespace std; // Calculate the sum  // of proper divisors int sumOfDiv(int x) {  // 1 is a proper divisor  int sum = 1;  for (int i = 2; i <= sqrt(x); i++)   {  if (x % i == 0) {  sum += i;  // To handle perfect squares  if (x / i != i)  sum += x / i;  }  }  return sum; } // Check if pair is amicable bool isAmicable(int a int b) {  return (sumOfDiv(a) == b &&   sumOfDiv(b) == a); } // This function prints count  // of amicable pairs present  // in the input array int countPairs(int arr[] int n) {  // Map to store the numbers  unordered_set<int> s;  int count = 0;  for (int i = 0; i < n; i++)  s.insert(arr[i]);  // Iterate through each number   // and find the sum of proper   // divisors and check if it's   // also present in the array  for (int i = 0; i < n; i++)   {  if (s.find(sumOfDiv(arr[i])) != s.end())   {  // It's sum of proper divisors  int sum = sumOfDiv(arr[i]);  if (isAmicable(arr[i] sum))  count++;  }  }  // As the pairs are counted   // twice thus divide by 2  return count / 2; } // Driver code int main() {  int arr1[] = { 220 284 1184   1210 2 5 };  int n1 = sizeof(arr1) / sizeof(arr1[0]);  cout << countPairs(arr1 n1)   << endl;    int arr2[] = { 2620 2924 5020   5564 6232 6368 };  int n2 = sizeof(arr2) / sizeof(arr2[0]);  cout << countPairs(arr2 n2)   << endl;  return 0; } 
Java
// Efficient Java program to count  // Amicable pairs in an array. import java.util.*; class GFG  { // Calculate the sum  // of proper divisors static int sumOfDiv(int x) {  // 1 is a proper divisor  int sum = 1;  for (int i = 2; i <= Math.sqrt(x); i++)   {  if (x % i == 0)   {  sum += i;  // To handle perfect squares  if (x / i != i)  sum += x / i;  }  }  return sum; } // Check if pair is amicable static boolean isAmicable(int a int b) {  return (sumOfDiv(a) == b &&   sumOfDiv(b) == a); } // This function prints count  // of amicable pairs present  // in the input array static int countPairs(int arr[] int n) {  // Map to store the numbers  HashSet<Integer> s = new HashSet<Integer>();  int count = 0;  for (int i = 0; i < n; i++)  s.add(arr[i]);  // Iterate through each number   // and find the sum of proper   // divisors and check if it's   // also present in the array  for (int i = 0; i < n; i++)   {  if (s.contains(sumOfDiv(arr[i])))   {  // It's sum of proper divisors  int sum = sumOfDiv(arr[i]);  if (isAmicable(arr[i] sum))  count++;  }  }  // As the pairs are counted   // twice thus divide by 2  return count / 2; } // Driver code public static void main(String[] args)  {  int arr1[] = { 220 284 1184   1210 2 5 };  int n1 = arr1.length;  System.out.println(countPairs(arr1 n1));    int arr2[] = { 2620 2924 5020   5564 6232 6368 };  int n2 = arr2.length;  System.out.println(countPairs(arr2 n2)); } } // This code is contributed by PrinciRaj1992  
Python
# Efficient Python3 program to count  # Amicable pairs in an array. import math # Calculating the sum # of proper divisors def sumOfDiv(x): # 1 is a proper divisor sum = 1; for i in range(2int(math.sqrt(x))): if x % i==0: sum += i # To handle perfect squares if i != x/i: sum += x/i return int(sum); # check if pair is amicable def isAmicable(a b): return (sumOfDiv(a) == b and sumOfDiv(b) == a) # This function prints count  # of amicable pairs present  # in the input array def countPairs(arrn): # Map to store the numbers s = set() count = 0 for i in range(n): s.add(arr[i]) # Iterate through each number  # and find the sum of proper  # divisors and check if it's  # also present in the array for i in range(n): if sumOfDiv(arr[i]) in s: # It's sum of proper divisors sum = sumOfDiv(arr[i]) if isAmicable(arr[i] sum): count += 1 # As the pairs are counted  # twice thus divide by 2 return int(count/2); # Driver Code  arr1 = [220 284 1184 1210 2 5] n1 = len(arr1) print(countPairs(arr1 n1)) arr2 = [2620 2924 5020 5564 6232 6368] n2 = len(arr2) print(countPairs(arr2 n2)) # This code is contributed  # by Naveen Babbar 
C#
// Efficient C# program to count  // Amicable pairs in an array. using System; using System.Collections.Generic;   class GFG  { // Calculate the sum  // of proper divisors static int sumOfDiv(int x) {  // 1 is a proper divisor  int sum = 1;  for (int i = 2; i <= Math.Sqrt(x); i++)   {  if (x % i == 0)   {  sum += i;  // To handle perfect squares  if (x / i != i)  sum += x / i;  }  }  return sum; } // Check if pair is amicable static Boolean isAmicable(int a int b) {  return (sumOfDiv(a) == b &&   sumOfDiv(b) == a); } // This function prints count  // of amicable pairs present  // in the input array static int countPairs(int []arr int n) {  // Map to store the numbers  HashSet<int> s = new HashSet<int>();  int count = 0;  for (int i = 0; i < n; i++)  s.Add(arr[i]);  // Iterate through each number   // and find the sum of proper   // divisors and check if it's   // also present in the array  for (int i = 0; i < n; i++)   {  if (s.Contains(sumOfDiv(arr[i])))   {  // It's sum of proper divisors  int sum = sumOfDiv(arr[i]);  if (isAmicable(arr[i] sum))  count++;  }  }  // As the pairs are counted   // twice thus divide by 2  return count / 2; } // Driver code public static void Main(String[] args)  {  int []arr1 = { 220 284 1184   1210 2 5 };  int n1 = arr1.Length;  Console.WriteLine(countPairs(arr1 n1));    int []arr2 = { 2620 2924 5020   5564 6232 6368 };  int n2 = arr2.Length;  Console.WriteLine(countPairs(arr2 n2)); } } // This code is contributed by Princi Singh 
JavaScript
<script> // JavaScript program to count // Amicable pairs in an array. // Calculate the sum // of proper divisors function sumOfDiv(x) {  // 1 is a proper divisor  let sum = 1;  for (let i = 2; i <= Math.sqrt(x); i++)  {  if (x % i == 0)  {  sum += i;    // To handle perfect squares  if (x / i != i)  sum += x / i;  }  }  return sum; }   // Check if pair is amicable function isAmicable(a b) {  return (sumOfDiv(a) == b &&  sumOfDiv(b) == a); }   // This function prints count // of amicable pairs present // in the input array function countPairs(arr n) {  // Map to store the numbers  let s = new Set();  let count = 0;  for (let i = 0; i < n; i++)  s.add(arr[i]);    // Iterate through each number  // and find the sum of proper  // divisors and check if it's  // also present in the array  for (let i = 0; i < n; i++)  {  if (s.has(sumOfDiv(arr[i])))  {  // It's sum of proper divisors  let sum = sumOfDiv(arr[i]);  if (isAmicable(arr[i] sum))  count++;  }  }    // As the pairs are counted  // twice thus divide by 2  return Math.floor(count / 2); }    // Driver code     let arr1 = [ 220 284 1184  1210 2 5 ];  let n1 = arr1.length;  document.write(countPairs(arr1 n1) + '  
'
); let arr2 = [ 2620 2924 5020 5564 6232 6368 ]; let n2 = arr2.length; document.write(countPairs(arr2 n2) + '
'
); </script>

Wyjście
2 3

Współautorem tego artykułu jest Ashutosh Kumar  

Utwórz quiz