Найти число, сумма делителей которого в три раза больше самого числа - QBasic

Узнай цену своей работы

Формулировка задачи:

Найти число, сумма делителей которого в три раза больше самого числа (Само число к делителям не относится) Программа нашла наименьшее из таких чисел - 30240 примечание Тут бейсику пришлось посчитать. Вероятнее всего он никогда не найдет числа, сумма делителей которого в 4 раза, (в 5 раз) больше самого числа...
Листинг программы
  1. REM
  2. REM 30240
  3. REM
  4. DECLARE FUNCTION f! (n!)
  5. CLS
  6. FOR i = 1000 TO 31000
  7. IF f(i) = 3 * i THEN PRINT i;
  8. NEXT
  9. END
  10. FUNCTION f (n)
  11. FOR i = 1 TO n \ 2
  12. IF n MOD i = 0 THEN s = s + i
  13. NEXT i
  14. f = s
  15. END FUNCTION

Решение задачи: «Найти число, сумма делителей которого в три раза больше самого числа»

textual
Листинг программы
  1. {$mode objfpc}
  2. uses windows;
  3.  
  4. type
  5.    Tlong = qword;
  6.  
  7. const
  8.    n = 50;
  9.  
  10. var
  11.   f : array [1 .. n] of
  12.   record
  13.     mult  : integer;
  14.     power : integer;
  15.   end;
  16.  
  17. // I variant
  18. function ds(i : longint) : longint;
  19. var j : longint;
  20. begin
  21.   result := 0;
  22.   for j := 1 to i div 2 do
  23.     if i mod j = 0 then result := result + j;
  24. end;
  25.  
  26.  
  27. procedure Add(i : integer);
  28. var
  29.    j : integer;
  30.    found : boolean;
  31. begin
  32.    found := false; j := 1;
  33.    while (j <= n) and (f[j].mult > 0) and (not found) do
  34.       if f[j].mult = i then
  35.       begin
  36.          inc(f[j].power); found := true;
  37.       end
  38.       else inc(j);
  39.  
  40.    if not found then
  41.    begin
  42.       f[j].mult := i; f[j].power := 1;
  43.    end;
  44. end;
  45.  
  46. function Factorization(x : Tlong) : Tlong;
  47. var i : Tlong;
  48.  
  49.    procedure DivX;
  50.    begin
  51.       while (x > 1) and (x mod i = 0) do
  52.       begin
  53.          Add(i); x := x div i;
  54.       end;
  55.    end;
  56.  
  57. var
  58.   j, k : integer;
  59.   t, s : Tlong;
  60.  
  61. begin
  62.    i := 2;
  63.    DivX;
  64.    i := 3;
  65.    while i < x div 2 do
  66.    begin
  67.       DivX;
  68.       inc(i,2);
  69.    end;
  70.    if x > 1 then Add(x);
  71.  
  72.    k := 1;
  73.    result := 1;
  74.    while (k <= n) and (f[k].mult > 0) do
  75.    begin
  76.       // write(f[k].mult, '^', f[k].power, ' ');
  77.  
  78.       t := 1; s := 1;
  79.       for j := 1 to f[k].power do
  80.       begin
  81.          t := t * f[k].mult;
  82.          s := s + t;
  83.       end;
  84.       result := result * s;
  85.       inc(k);
  86.    end;
  87. end;
  88.  
  89. var
  90.    p, num : Tlong;
  91.    i : integer;
  92.  
  93.    tm : dword;
  94. begin
  95.    tm := gettickcount;
  96.    num := 2;
  97.    repeat
  98.       inc(num, 2);
  99.       FillByte(f, sizeof(f), 0); // обнуляем массив структур
  100.       p := Factorization(num);
  101.    until(p = 4 * num);
  102.    writeln(num, ': sum of divisors = ', p, ' vs ', 4 * num);
  103.    writeln('time = ', gettickcount - tm);
  104.  
  105.    // сравниваем с твоим методом вычисления суммы делителей
  106.    tm := gettickcount;
  107.    for i := 1 to 20000 do
  108.    if ds(2*i) = 3 * 2*i then
  109.    begin
  110.       writeln(2*i); break;
  111.    end;
  112.    writeln('time = ', gettickcount - tm);
  113.  
  114.    readln;
  115. end.

Объяснение кода листинга программы

  1. В первой строке объявлен массив структур с двумя полями: mult и power.
  2. Далее идет функция ds, которая вычисляет сумму делителей числа i.
  3. После этого идет процедура Add, которая добавляет число i в массив f, если оно еще не присутствует.
  4. Затем идет функция Factorization, которая вычисляет факторизацию числа x.
  5. В основной части кода идет поиск числа, для которого сумма делителей равна 4 разам самого числа.
  6. В конце кода идет сравнение с другим методом вычисления суммы делителей и выводится время выполнения.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.846 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы