Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.12.2011, 22:10   #1
Forgotthen
 
Регистрация: 06.12.2011
Сообщений: 4
Восклицание Вывод "Дружественных" чисел (Pascal 7.1)

Два натуральных числа называются "дружественными", если каждое из них равно сумме всех делителей другого, за исключением его самого (таковы, например, числа 220 и 284). Напечатать все пары "дружественных" чисел, не превосходящих заданного натурального числа
Forgotthen вне форума Ответить с цитированием
Старый 08.12.2011, 22:53   #2
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,865
По умолчанию

Вы не указали, до какого именно натурального числа вам надо напечатать такие числа. Но вот вам дружественные числа до 65535:
Код:
1, 1
6, 6
28, 28
220, 284
496, 496
1184, 1210
2620, 2924
5020, 5564
6232, 6368
8128, 8128
10744, 10856
12285, 14595
17296, 18416
Arigato вне форума Ответить с цитированием
Старый 10.12.2011, 13:27   #3
Forgotthen
 
Регистрация: 06.12.2011
Сообщений: 4
По умолчанию

Напечатать все пары "дружественных" чисел, не превосходящих заданного натурального числа Вот до какова
Forgotthen вне форума Ответить с цитированием
Старый 10.12.2011, 13:28   #4
Forgotthen
 
Регистрация: 06.12.2011
Сообщений: 4
По умолчанию

нужно чтобы при вводе какова либо числа выводились все пары "дружественных" чисел не больше заданого числа
Forgotthen вне форума Ответить с цитированием
Старый 10.12.2011, 13:37   #5
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

Код:
function sum_del(n:integer):integer;
var i, res : integer;
begin
  res := 1;
  for i := 2 to n-1 do
    if n mod i = 0 then
      res := res + i;
  sum_del := res;
end;
var N, i, j : integer;
begin
  WriteLn('Enter N, please:');
  ReadLn(N);
  for i := 1 to N-1 do
    for j := i+1 to N do
        if (sum_del(i) = j)and(sum_del(j)=i)and(j>i) then
          WriteLn(i,' ',j);
  ReadLn;
end.
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"

Последний раз редактировалось Mad_Cat; 10.12.2011 в 13:40.
Mad_Cat вне форума Ответить с цитированием
Старый 10.12.2011, 13:50   #6
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,865
По умолчанию

Mad_Cat, что-то очень не оптимально. Попробуйте для миллиона запустить...

Более рациональный вариант:

Код:
var i, n, Sum, T, Num: Integer;

function DivsSum (a: Integer): Integer;
var Res, i, Neg: Integer;
begin
  Res := 1;
  for i := 2 to Trunc (Sqrt (a)) do
  begin
    if a mod i = 0 then
    begin
      Inc (Res, i);
      Neg := a div i;
      if Neg <> i then Inc (Res, Neg);
    end; {if}
  end; {for}
  Result := Res;
end;

function DivsSumLim (a, Lim: Integer): Integer;
var Res, i, Neg: Integer;
begin
  Res := 1;
  for i := 2 to Trunc (Sqrt (a)) do
  begin
    if a mod i = 0 then
    begin
      Inc (Res, i);
      Neg := a div i;
      if Neg <> i then Inc (Res, Neg);
      if Res > Lim then Break;
    end; {if}
  end; {for}
  Result := Res;
end;

begin
  T := GetTickCount;
  n := 1000000;
  Num := 1;
  for i := 1 to n do
  begin
    Sum := DivsSum (i);
    if (Sum >= i) and (Sum <= n) and (i = DivsSumLim (Sum, i)) then
    begin
      WriteLn (Num, '. ', i, ', ', Sum);
      Inc (Num);
    end; {if}
  end; {for}
  WriteLn ('T = ', IntToStr (GetTickCount - T));
  ReadLn;
end.
У меня до миллиона за 2 с небольшим секунды делает. Еще он тут время работы подсчитывает. Кстати, можно еще оптимизировать, если делители в массив вынести, но уже лень...

P.S. Только это на Делфи. На Паскаль сами переделывайте, суть главное понятна должна быть из решения.

Последний раз редактировалось Arigato; 14.12.2011 в 01:11.
Arigato вне форума Ответить с цитированием
Старый 10.12.2011, 13:53   #7
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

Цитата:
Mad_Cat, что-то очень не оптимально.
А никто и не просил оптимально)
просили вот
Цитата:
нужно чтобы при вводе какова либо числа выводились все пары "дружественных" чисел не больше заданого числа
программа это делает? - делает! оптимизация На ТС
у вас тоже косячок

Цитата:
1. 1, 1
2. 6, 6
3. 28, 28
....
5. 496, 496
..
10. 8128, 8128
числа разными должны быть наверное)
дружественные числа
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"

Последний раз редактировалось Mad_Cat; 10.12.2011 в 13:58.
Mad_Cat вне форума Ответить с цитированием
Старый 10.12.2011, 13:55   #8
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,865
По умолчанию

Я к тому, что просто не люблю лобовые решения. А если ее на Турбо Паскаль запустить и ввести 30000, как быстро она отработает? Мой вариант за 15 миллисекунд, т.е. мгновенно.
Arigato вне форума Ответить с цитированием
Старый 10.12.2011, 13:59   #9
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

Лучше медленно - но верно, чем быстро и не точно)
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Старый 10.12.2011, 14:03   #10
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,865
По умолчанию

Лучше верно и быстро

Цитата:
Сообщение от Mad_Cat Посмотреть сообщение
числа разными должны быть наверное)
В условии ТС не сказано, что числа должны быть различными.
Arigato вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа функциями "ЕСЛИ", "И" и вывод текстового результата johny_03 Microsoft Office Excel 3 04.08.2014 11:01
Вывести название соответствующей карты вида "шестерка бубен", "дама червей","туз треф" и т.п. воваава Помощь студентам 3 01.12.2011 12:50
"вывод таблиц" и "тест" neprogrammist Помощь студентам 9 12.05.2010 08:18
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
настроить при открытии Excel 2003 в окошке "Тип файлов" вывод пункта "Все файлы (*.*)" по умолчанию? Unior Microsoft Office Excel 2 01.03.2009 02:42