Рубрики

Пары дружных чисел

Учитывая массив целых чисел, выведите количество пар в массиве, которые образуют дружную пару . Два числа являются дружественными, если первое равно сумме делителей второго, и если второе число равно сумме делителей первого.

Примеры :

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

Простое решение состоит в том, чтобы обойти каждую пару и проверить, образуют ли они дружную пару, если мы действительно увеличиваем счет.

C ++

// Простая программа на C ++ для подсчета
// дружные пары в массиве.
#include <bits/stdc++.h>

using namespace std;

  
// Рассчитать сумму
// правильных делителей

int sumOfDiv(int x)

{

    // 1 - правильный делитель

    int sum = 1;

    for (int i = 2; i <= sqrt(x); i++) 

    {

        if (x % i == 0) 

        {

            sum += i;

  

            // Для обработки идеальных квадратов

            if (x / i != i)

                sum += x / i;

        }

    }

    return sum;

}

  
// Проверяем, дружна ли пара

bool isAmicable(int a, int b)

{

    return (sumOfDiv(a) == b && 

            sumOfDiv(b) == a);

}

  
// Эта функция печатает пару
// присутствуют дружные пары
// во входном массиве

int countPairs(int arr[], int n)

{

    int count = 0;

  

    // Перебираем каждый

    // пара, и найти, если это

    // дружная пара

    for (int i = 0; i < n; i++)

        for (int j = i + 1; j < n; j++)

            if (isAmicable(arr[i], arr[j]))

                count++;

  

    return count;

}

  
// Код драйвера

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-программа для подсчета
// дружные пары в массиве.

import java.io.*;

  

class GFG 

{

  

    // Рассчитать сумму

    // правильных делителей

    static int sumOfDiv(int x)

    {

  

        // 1 - правильный делитель

        int sum = 1;

        for (int i = 2; i <= Math.sqrt(x); i++) 

        {

            if (x % i == 0

            {

                sum += i;

  

                // Для обработки идеальных квадратов

                if (x / i != i)

                    sum += x / i;

            }

        }

  

        return sum;

    }

  

    // Проверяем, дружна ли пара

    static boolean isAmicable(int a, int b)

    {

        return (sumOfDiv(a) == b && 

                sumOfDiv(b) == a);

    }

  

    // Эта функция печатает пару

    // присутствуют дружные пары

    // во входном массиве

    static int countPairs(int arr[], int n)

    {

        int count = 0;

  

        // перебираем каждую пару,

        // и найти дружную пару

        for (int i = 0; i < n; i++)

            for (int j = i + 1; j < n; j++)

                if (isAmicable(arr[i], arr[j]))

                    count++;

  

        return count;

    }

  

    // Код драйвера

    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));

    }

}

  
// Этот код предоставлен Аншикой Гоял.

python3

# Python3 программа для подсчета
# дружных пар в массиве

  
# Рассчитать сумму
Количество правильных делителей

def sumOfDiv(x):

    sum = 1

    for i in range(2, x):

        if x % i == 0:

            sum += i

    return sum

  
# Проверьте, дружна ли пара

def isAmicable(a, b):

    if sumOfDiv(a) == b and sumOfDiv(b) == a:

        return True

    else:

        return False

  
# Эта функция печатает пару
Количество дружных пар присутствующих
# во входном массиве

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

  
Код водителя

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))

  
# Этот код добавлен
# Смита Динеш Семвал

C #

// Простая программа на C # для подсчета
// дружные пары в массиве.

using System;

  

class GFG 

{

      

    // Рассчитать сумму

    // правильных делителей

    static int sumOfDiv(int x)

    {

          

        // 1 - правильный делитель

        int sum = 1;

        for (int i = 2; i <= Math.Sqrt(x); i++) 

        {

            if (x % i == 0) 

            {

                sum += i;

  

                // Для обработки идеальных квадратов

                if (x / i != i)

                    sum += x / i;

            }

        }

          

        return sum;

    }

  

    // Проверяем, дружна ли пара

    static bool isAmicable(int a, int b)

    {

        return (sumOfDiv(a) == b &&

                sumOfDiv(b) == a);

    }

  

    // Эта функция печатает пару

    // присутствуют дружные пары

    // во входном массиве

    static int countPairs(int []arr, int n)

    {

        int count = 0;

  

        // перебираем каждую пару,

        // и найти дружную пару

        for (int i = 0; i < n; i++)

          

            for (int j = i + 1; j < n; j++)

                if (isAmicable(arr[i], arr[j]))

                    count++;

  

        return count;

    }

  

    // Код драйвера

    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));

    }

}

  
// Этот код предоставлен vt_m.

PHP

<?php
// Простая PHP-программа для подсчета
// дружные пары в массиве.

  
// Рассчитать сумму
// правильных делителей

function sumOfDiv( $x)

{

    // 1 - правильный делитель

    $sum = 1;

    for ( $i = 2; $i <= sqrt($x); $i++) 

    {

        if ($x % $i == 0) 

        {

            $sum += $i;

  

            // Для обработки идеальных квадратов

            if ($x / $i != $i)

                $sum += $x / $i;

        }

    }

    return $sum;

}

  
// Проверяем, дружна ли пара

function isAmicable( $a, $b)

{

    return (sumOfDiv($a) == $b and 

            sumOfDiv($b) == $a);

}

  
// Эта функция печатает пару
// присутствуют дружные пары
// во входном массиве

function countPairs( $arr, $n)

{

    $count = 0;

  

    // перебираем каждую пару,

    // и найти дружную пару

    for ( $i = 0; $i < $n; $i++)

        for ( $j = $i + 1; $j < $n; $j++)

            if (isAmicable($arr[$i], $arr[$j]))

                $count++;

  

    return $count;

}

  
// Код драйвера

$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);

  
// Этот код предоставлен anuj_67.
?>


Выход :

2
3

Эффективное решение состоит в том, чтобы сохранить числа, хранящиеся на карте, и для каждого числа мы находим сумму его правильного делителя и проверяем, присутствует ли оно и в массиве. Если он присутствует, мы можем проверить, составляют ли они дружную пару или нет.

Таким образом, сложность будет значительно снижена. Ниже программа C ++ для того же.

C ++

// Эффективная программа на С ++ для подсчета
// Дружные пары в массиве.
#include <bits/stdc++.h>

using namespace std;

  
// Рассчитать сумму
// правильных делителей

int sumOfDiv(int x)

{

    // 1 - правильный делитель

    int sum = 1;

    for (int i = 2; i <= sqrt(x); i++) 

    {

        if (x % i == 0) {

            sum += i;

  

            // Для обработки идеальных квадратов

            if (x / i != i)

                sum += x / i;

        }

    }

    return sum;

}

  
// Проверяем, дружна ли пара

bool isAmicable(int a, int b)

{

    return (sumOfDiv(a) == b && 

            sumOfDiv(b) == a);

}

  
// Эта функция печатает счет
// присутствуют дружные пары
// во входном массиве

int countPairs(int arr[], int n)

{

    // Карта для хранения номеров

    unordered_set<int> s;

    int count = 0;

    for (int i = 0; i < n; i++)

        s.insert(arr[i]);

  

    // перебираем каждое число,

    // и найти сумму правильных

    // делители и проверьте, если это

    // также присутствует в массиве

    for (int i = 0; i < n; i++) 

    {

        if (s.find(sumOfDiv(arr[i])) != s.end()) 

        {

            // Это сумма правильных делителей

            int sum = sumOfDiv(arr[i]);

            if (isAmicable(arr[i], sum))

                count++;

        }

    }

  

    // Как считаются пары

    // дважды, таким образом, делим на 2

    return count / 2;

}

  
// Код драйвера

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-программа для подсчета
// Дружные пары в массиве.

import java.util.*;

  

class GFG 

{

  
// Рассчитать сумму
// правильных делителей

static int sumOfDiv(int x)

{

    // 1 - правильный делитель

    int sum = 1;

    for (int i = 2; i <= Math.sqrt(x); i++) 

    {

        if (x % i == 0

        {

            sum += i;

  

            // Для обработки идеальных квадратов

            if (x / i != i)

                sum += x / i;

        }

    }

    return sum;

}

  
// Проверяем, дружна ли пара

static boolean isAmicable(int a, int b)

{

    return (sumOfDiv(a) == b && 

            sumOfDiv(b) == a);

}

  
// Эта функция печатает счет
// присутствуют дружные пары
// во входном массиве

static int countPairs(int arr[], int n)

{

    // Карта для хранения номеров

    HashSet<Integer> s = new HashSet<Integer>();

    int count = 0;

    for (int i = 0; i < n; i++)

        s.add(arr[i]);

  

    // перебираем каждое число,

    // и найти сумму правильных

    // делители и проверьте, если это

    // также присутствует в массиве

    for (int i = 0; i < n; i++) 

    {

        if (s.contains(sumOfDiv(arr[i]))) 

        {

            // Это сумма правильных делителей

            int sum = sumOfDiv(arr[i]);

            if (isAmicable(arr[i], sum))

                count++;

        }

    }

  

    // Как считаются пары

    // дважды, таким образом, делим на 2

    return count / 2;

}

  
// Код драйвера

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));

}
}

  
// Этот код предоставлен PrinciRaj1992

C #

// Эффективная программа на C # для подсчета
// Дружные пары в массиве.

using System;

using System.Collections.Generic;

      

class GFG 

{

  
// Рассчитать сумму
// правильных делителей

static int sumOfDiv(int x)

{

    // 1 - правильный делитель

    int sum = 1;

    for (int i = 2; i <= Math.Sqrt(x); i++) 

    {

        if (x % i == 0) 

        {

            sum += i;

  

            // Для обработки идеальных квадратов

            if (x / i != i)

                sum += x / i;

        }

    }

    return sum;

}

  
// Проверяем, дружна ли пара

static Boolean isAmicable(int a, int b)

{

    return (sumOfDiv(a) == b && 

            sumOfDiv(b) == a);

}

  
// Эта функция печатает счет
// присутствуют дружные пары
// во входном массиве

static int countPairs(int []arr, int n)

{

    // Карта для хранения номеров

    HashSet<int> s = new HashSet<int>();

    int count = 0;

    for (int i = 0; i < n; i++)

        s.Add(arr[i]);

  

    // перебираем каждое число,

    // и найти сумму правильных

    // делители и проверьте, если это

    // также присутствует в массиве

    for (int i = 0; i < n; i++) 

    {

        if (s.Contains(sumOfDiv(arr[i]))) 

        {

            // Это сумма правильных делителей

            int sum = sumOfDiv(arr[i]);

            if (isAmicable(arr[i], sum))

                count++;

        }

    }

  

    // Как считаются пары

    // дважды, таким образом, делим на 2

    return count / 2;

}

  
// Код драйвера

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));

}
}

  
// Этот код предоставлен Принчи Сингхом

Выход :

2
3

Эта статья пополняемая Ashutosh Кумар Если вам нравится GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Пары дружных чисел

0.00 (0%) 0 votes