Дружественные числа
Даны два целых положительных числа 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 шт):
Требуется вывести все пары «дружественных» чисел, расположенные на отрезке [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);
}
}
Вы же почему-то считаете, что первое число - количество пар, нет?