Дружественные числа

Даны два целых положительных числа M, N. Требуется найти все «дружественные» пары чисел на отрезке [M; N]. Дружественным для числа А является такое число В, что оно равно сумме делителей А, исключая само значение А. И наоборот, сумма делителей В, исключая В, равняется А. A не равно B. Требуется вывести все пары «дружественных» чисел, расположенные на отрезке [M; N]. Пару «дружественных» чисел (E, F) нужно выводить раньше пары «дружественных» чисел (K, P), когда минимальный элемент пары «дружественных» чисел (E, F) меньше минимального элемента пары «дружественных» чисел (K, P). Число E в паре «дружественных» чисел (E, F) нужно выводить раньше числа F из этой же пары, когда Е меньше F. Числа в паре нужно разделять пробелом, ставить пробел после второго члена пары не нужно. Sample Input 210 294 Sample Output 220 284

#include <stdio.h>
 
 
int _devs_sum(int _value)
{
    int _res = 0, i;
    for(i = 1; i <= _value / 2; i++)
        if(_value % i == 0)
            _res += i;
    return _res;
}
int main(void)
{
    int _pairs_n, _first, _second;
    scanf("%d", &_pairs_n);
    for(_first = 2; _pairs_n > 0; _first++)
    {
        _second = _devs_sum(_first);
        if(_first < _second && _devs_sum(_second) == _first)
        {
            printf("%d %d\n", _first, _second);
            _pairs_n--;
        }
    }
 
    return 0;
}

Программа выводит все пары, а должна только первую. Подскажите, как исправить?


Ответы (1 шт):

Автор решения: Harry

Требуется вывести все пары «дружественных» чисел, расположенные на отрезке [M;N]

int divsum(int M)
{
    int sum = 1;
    for(int i = 2; i*i <= M; ++i)
        if (M%i==0) sum += i + ((M/i != i) ? M/i : 0);
    return sum;
}

int main()
{
    int M, N;
    scanf("%d %d",&M,&N);
    for(int i = M; i <= N; ++i)
    {
        int j = divsum(i);
        if (j >= i)  continue;
        if (divsum(j) == i) printf("%d %d\n",j,i);
    }
}

Вы же почему-то считаете, что первое число - количество пар, нет?

→ Ссылка