Привет, мноого времени уже ломаю голову над задачей, мне хотя бы алгоритм решения...
Задача Диксона. Будем говорить, что три натуральных числа образуют дружественную тройку, если сумма собственных делителей каждого числа равна сумме двух других чисел. Отыскать хотя бы одну дружественную тройку натуральных чисел.
С дружественной двойкой я бы справился, это легко, но когда одновременно надо подобрать 3 числа.....
Заранее спасибо за любую подсказку
такая пойдет ? 1980, 2016, 2556.
А вообще показывай для двойки свой код, посмотрим
Malice, в инете нашел тройку эту ?
Кода для двойки нет но впринцепи знаю как реализовать...
Скажите как это как в алгоритме будет выглядеть.... как я вижу числа могут быть в большом разбросе
что есть собственные делители?...
например, для числа 12 - это 1,2,3,4,6,12?
если так, то, например, дружественные тройки - это
6 6 6
(1+2+3+6=6+6)
28 28 28
(1+2+4+7+14+28=28+28)
36 36 55
(1+2+3+4+6+9+12+18+36=55+36)
496 496 496
нашла перебором. достаточно долго, но с учетом, что нам нужна лишь 1 тройка, можно было дойти лишь до 6 - это уже достаточно быстро.
ну и, опять же, раз только одна - можно воспользоваться поиском совершенных чисел (было на форуме). 3 одинаковых совершенных числа - такая тройка.
Юля, само число не надо считать... При вычислении таких "дружественных цепочек" (amicable chains) считается сумма так называемых "proper divisors":
Какие числа я понимаю и как они находятся в математической части ....
А может както так -
Перебераем первое число А пока не найдем для него дружественное число - Б, если оно найдено, то Б есть сумма двух числе С+В которые дружественны А.и как то из этой суммы надо выделить эти 2 числа.. Бред какойто получился ))
Вот быстро наваял тут для двух чисел ) нооо чето не работает ) зацикливается и не выходит из програмки
Uses CRT;
var b,d1,d2,i,a:integer;
flag1,flag2:boolean;
begin
CLRSCR;
writeln('Дружественная двойка');
flag1:=false;
flag2:=false;
a:=2;
b:=2;
d1:=0; d2:=0;
Repeat
a:=a+1;
Repeat
b:=b+1;
for i:=1 to b-1 do {Ищем норм делители для второго числа и сумируем}
if (b mod i)=0 then d1:=d1+i;
if d1=a then {если сумма норм делителей 2ого числа и первое число равны то находим обратное утверждение}
begin
for i:=1 to a-1 do
if (a mod i)=0 then d2:=d2+i;
if d2=b then {Если и сумма норм. делителей числа А совпало с числом Б то флаги тру}
begin
flag2:=true;
flag1:=true;
end;
end;
Until flag2=true;
Until flag1=true;
writeln(a,' ',b,' ',d1,' ',d2);
readln;
end.
Перебираем А. Для А считаем сумму делителей S. Перебираем все пары (B, C) такие, что B + C = S. Для каждой такой пары проверяем два других условия.
Сумму делителей не считай каждый раз - лучше завести массив sum_of_divisors[], и заполнить его один раз вначале.
Спасиб вопросы....
"Для каждой такой пары проверяем два других условия."
Это какие условия ? (S(B)=A+C) and (S©=A+B)
Перебор можно делать обычный, только упростить его несколькими условиями:
1. считаем все тройку чисел (A,B, C) отсортированной по возрастанию, тогда B>=A, C>=B. Тогда тройки не будут повторятся в разных комбинациях
2. при переборе B сужаем границы - слева понятно - B>=A, справа - оно меньше S(A) (ведь по условию s(a)=b+c)
3. C вообще не перебираем, оно должно быть равно S(A)-B
Дальше просто проверка на 3 условия. При таком раскладе ту тройку можно найти в в течении минуты
НУ вот сделал.. сделал специально вывод промежуточный чисел а б с .. сижу с запущеной программой минуту число а ткоа до 160ого поменялось, В и С меняются на разные числа.... может не правильно поправляйте.. Сори , еще раз запустил, изменив тип данных - на Интеджер вместо лОнгИнт... так быстрее перебирает А
Uses CRT;
var b,c,d3,d1,d2,j,i,a:Integer;
flag1:boolean;
begin
CLRSCR;
writeln('Ќ 宦¤ҐЁҐ ¤а㦥б⢥®© ва®©ЄЁ');
flag1:=false;
a:=2;
b:=2;
d1:=0; d2:=0; d3:=0;
Repeat
a:=a+1;
for i:=1 to a-1 do
if (a mod i)=0 then d1:=d1+i;
For b:=a to d1 do
begin
for j:=1 to b-1 do
if ((b mod j)=0) then d2:=d2+j;
c:=d1-b;
for i:=1 to c-1 do
if (c mod i)=0 then d3:=d3+i;
writeln(a,' ',b,' ',c);
if (d1=b+c) and (d2=a+c) and (d3=a+b) then
begin
writeln(a,' ',b,' ',c);
flag1:=true;
end;
end;
Until flag1=true;
readln;
end.
Слушай, я этого не понимаю как можно просчитать суммы эти заранее не зная чисел, и при том они меняются постоянно .... если можно то подробней
посчитай сумму делителей для каждого числа от 1 до 10000, а потом используй.
и правда забыл обнулят ь я рассеяный с улицы басеяной
Это, теперь начиная с а=2
находит тройку но 120 240 0 .... и так всегда в конце 0, если менять a на большее значительно число.. н/п -
1740 3300 0
что не так?
ага точно.. сработало...
Задача решена Спасибо всем кто помогал мне.