Вычислить 100!+2^100 - Free Pascal

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

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

Нужно написать процедуру нахождения 100 факториал + 2 в 100 степени. Вот 2 блока программы. Они различны тем, что A[J] := A[J] * 2 (для 2^100), а A[J] := A[J] * I (для 100 факториал). Помогите укоротить и оптимизировать написав процедуру.
Листинг программы
  1. program Project800;
  2. {$R *.res}
  3. uses
  4. System.SysUtils;
  5. type
  6. Mas = array [1 .. 100] of Integer;
  7.  
  8. procedure NotNull(A: Mas; K: Integer);
  9. begin
  10. if A[K] < 10000 then
  11. Write(0);
  12. if A[K] < 1000 then
  13. Write(0);
  14. if A[K] < 100 then
  15. Write(0);
  16. if A[K] < 10 then
  17. Write(0);
  18. Write(A[K]);
  19. end;
  20. var
  21. I, F1,m, N,J: Integer;
  22. A: Mas;
  23. //Блок выполняющий возведения 2^100 степени
  24. begin
  25. A[1] := 1;
  26. for I := 2 to 100 do
  27. begin
  28. for J := 1 to 99 do
  29. A[J] := A[J] * 2;
  30. for J := 1 to 99 do
  31. if A[J] > 999999 then
  32. begin
  33. A[J + 1] := A[J + 1] + A[J] div 1000000;
  34. A[J] := A[J] mod 1000000;
  35. end;
  36. end;
  37. F1 := 1;
  38. for I := 100 downto 1 do
  39. begin
  40. if F1 = 0 then
  41. NotNull(A, I);
  42. if (A[I] > 0) and (F1 = 1) then
  43. begin
  44. J:=A[I];
  45. Write(J);
  46. end;
  47. end;
  48. //Блок программы выполняющая вычмисления 100!.
  49. begin
  50. A[1] := 1;
  51. for I := 2 to 100 do
  52. begin
  53. for M := 1 to 99 do
  54. A[M] := A[M] * I;
  55. for M := 1 to 99 do
  56. if A[M] > 999999 then
  57. begin
  58. A[M + 1] := A[M + 1] + A[M] div 1000000;
  59. A[M] := A[M] mod 1000000;
  60. end;
  61. end;
  62. F1 := 1;
  63. for I := 100 downto 1 do
  64. begin
  65. if F1 = 0 then
  66. NotNull(A, I);
  67. if (A[I] > 0) and (F1 = 1) then
  68. begin
  69. N:=A[I];
  70. Write(N);
  71. end;
  72. end;
  73. end;
  74. ReadLn;
  75. end.

Решение задачи: «Вычислить 100!+2^100»

textual
Листинг программы
  1. {$mode objfpc}
  2. uses gmp;
  3.  
  4. var
  5.   p, q : mpz_t;
  6.   i : integer;
  7. begin
  8.   mpz_init_set_si(p, 1);
  9.   mpz_init_set_si(q, 1);
  10.   for i := 1 to 100 do
  11.   begin
  12.     p := p * i;
  13.     q := q * 2;
  14.   end;
  15.   p := p + q;
  16.   mp_printf('%Zd', [@p]);
  17. end.

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

  1. Объявлены переменные p, q типа mpz_t, предназначенные для работы с большими числами.
  2. Инициализированы переменные p, q значением 1.
  3. Задаётся цикл от 1 до 100.
  4. В каждой итерации цикла переменная p умножается на текущее значение i, а переменная q умножается на 2.
  5. После завершения цикла, значение переменной p увеличивается на значение переменной q.
  6. Используя функцию mp_printf, выводится на экран значение переменной p.

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


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

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

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

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

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

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