Вычислить произведение первых ста натуральных чисел (использовать динамическую память) - Pascal

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

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

Написать программу, вычисляющую произведение первых ста натуральных чисел. Использовать динамическую память и указатели.

Решение задачи: «Вычислить произведение первых ста натуральных чисел (использовать динамическую память)»

textual
Листинг программы
  1. program la;
  2. type
  3.   bigint = array[0..100] of int64;
  4. var
  5.   base : int64;
  6.   x, y, z, res, fact, q, w : bigint;
  7.   i, n : integer;
  8.  
  9. function get_max(a, b : integer) : integer;
  10. begin
  11.   if(a > b) then get_max := a else get_max := b;
  12. end;
  13.  
  14. procedure copy_bigint(var bto : bigint; var bfrom : bigint);
  15. var ii : integer;
  16. begin
  17.   for ii := 0 to 100 do bto[ii] := bfrom[ii];
  18. end;
  19.  
  20. procedure make_bigint(var a : bigint; x : int64);
  21. var ii: integer;
  22. begin
  23.   for ii := 0 to 100 do a[ii] := 0;
  24.   ii := 0;
  25.   while (x > 0) do begin
  26.     a[ii] := x mod base;
  27.     x := x div base;
  28.     ii := ii + 1;
  29.   end;
  30. end;
  31.  
  32. function get_size_bigint(var a : bigint) : integer;
  33. var ii, f: integer;
  34. begin
  35.   ii := 100;
  36.   f := 0;
  37.   while(ii >= 0) do begin
  38.     if(a[ii] <> 0) then begin
  39.       f := 1;
  40.       break;
  41.     end;
  42.      
  43.     ii := ii - 1;
  44.   end;
  45.  
  46.   if(f <> 0) then get_size_bigint := ii + 1 else get_size_bigint := 1;
  47. end;
  48.  
  49. procedure add_bigint(var a : bigint; var b : bigint; var c : bigint);
  50. var carry : int64;
  51.     ii, size : integer;
  52. begin
  53.   make_bigint(c, 0);
  54.   carry := 0;
  55.   size := get_max(get_size_bigint(a), get_size_bigint(b));
  56.   ii := 0;
  57.   while((ii < size) or (carry <> 0)) do begin
  58.     c[ii] := carry + a[ii] + b[ii];
  59.     if(c[ii] >= base) then carry := 1 else carry := 0;
  60.     if(carry <> 0) then c[ii] := c[ii] - base;
  61.     ii := ii + 1;
  62.   end;
  63. end;
  64.  
  65. //умножение(тривиальное, в столбик) O(n^2), для большего ускорения умножение можно делать через алгоритм карацубы ~ O(n^1.573), или БФТ (FFT) (быстрое преобразование фурье) O(n * log(n))
  66. procedure mul_bigint(var a : bigint; var b : bigint; var c : bigint);
  67. var carry, cur : int64;
  68.     ii, jj, sizea, sizeb : integer;
  69. begin
  70.   make_bigint(c, 0);
  71.   carry := 0;
  72.   sizea := get_size_bigint(a); sizeb := get_size_bigint(b);
  73.  
  74.   for ii := 0 to sizea - 1 do begin
  75.     jj := 0;
  76.     while((jj < sizeb) or (carry <> 0)) do begin
  77.       cur := carry + c[ii + jj] + a[ii] * b[jj];
  78.       c[ii + jj] := cur mod base;
  79.       carry := cur div base;
  80.       jj := jj + 1;
  81.     end;
  82.   end;
  83. end;
  84.  
  85. function to_str_bigint(var a : bigint) : string;
  86. var ii, jj : integer;
  87.     s, st : string;
  88. begin
  89.   ii := get_size_bigint(a);
  90.   st := IntToStr(a[ii - 1]);
  91.   jj := ii - 2;
  92.   while(jj >= 0) do begin
  93.     s := IntToStr(a[jj]);
  94.     while(length(s) < 9) do s := '0' + s;
  95.     st := st + s;
  96.     jj := jj - 1;
  97.   end;
  98.   to_str_bigint := st;
  99. end;
  100.  
  101. begin
  102.   base := 1000000000;
  103.  
  104.   //считаем факториал:
  105.   make_bigint(fact, 1);
  106.   for i := 2 to 100 do begin
  107.     //fact := fact * q
  108.     make_bigint(q, i);
  109.     mul_bigint(fact, q, w); //w := fact * q
  110.     copy_bigint(fact, w); //fact := w
  111.   end;
  112.  
  113.   writeln(to_str_bigint(fact));  
  114. end.

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

Этот код написан на языке Pascal и предназначен для вычисления произведения первых ста натуральных чисел с использованием динамической памяти. В начале объявляются необходимые типы данных и переменные. Затем идет функция get_max, которая сравнивает два числа и возвращает максимальное из них. Далее идет функция get_size_bigint, которая вычисляет размер наибольшего числа, которое может быть помещено в массив типа bigint. Следующая функция add_bigint используется для сложения трех чисел с использованием массива типа bigint. Функция mul_bigint выполняет умножение двух чисел с использованием массива типа bigint. В конце кода вычисляется факториал числа, используя динамическую память, и выводится его строковое представление. Общая структура кода напоминает реализацию стека с использованием массива. Каждая функция использует ранее определенные функции и переменные, что позволяет избежать дублирования кода.

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


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

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

15   голосов , оценка 4 из 5

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

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

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