Вычислить 100!+2^100 - Free Pascal
Формулировка задачи:
Нужно написать процедуру нахождения 100 факториал + 2 в 100 степени. Вот 2 блока программы. Они различны тем, что A[J] := A[J] * 2 (для 2^100), а A[J] := A[J] * I (для 100 факториал). Помогите укоротить и оптимизировать написав процедуру.
program Project800;
{$R *.res}
uses
System.SysUtils;
type
Mas = array [1 .. 100] of Integer;
procedure NotNull(A: Mas; K: Integer);
begin
if A[K] < 10000 then
Write(0);
if A[K] < 1000 then
Write(0);
if A[K] < 100 then
Write(0);
if A[K] < 10 then
Write(0);
Write(A[K]);
end;
var
I, F1,m, N,J: Integer;
A: Mas;
//Блок выполняющий возведения 2^100 степени
begin
A[1] := 1;
for I := 2 to 100 do
begin
for J := 1 to 99 do
A[J] := A[J] * 2;
for J := 1 to 99 do
if A[J] > 999999 then
begin
A[J + 1] := A[J + 1] + A[J] div 1000000;
A[J] := A[J] mod 1000000;
end;
end;
F1 := 1;
for I := 100 downto 1 do
begin
if F1 = 0 then
NotNull(A, I);
if (A[I] > 0) and (F1 = 1) then
begin
J:=A[I];
Write(J);
end;
end;
//Блок программы выполняющая вычмисления 100!.
begin
A[1] := 1;
for I := 2 to 100 do
begin
for M := 1 to 99 do
A[M] := A[M] * I;
for M := 1 to 99 do
if A[M] > 999999 then
begin
A[M + 1] := A[M + 1] + A[M] div 1000000;
A[M] := A[M] mod 1000000;
end;
end;
F1 := 1;
for I := 100 downto 1 do
begin
if F1 = 0 then
NotNull(A, I);
if (A[I] > 0) and (F1 = 1) then
begin
N:=A[I];
Write(N);
end;
end;
end;
ReadLn;
end.Решение задачи: «Вычислить 100!+2^100»
textual
Листинг программы
{$mode objfpc}
uses gmp;
var
p, q : mpz_t;
i : integer;
begin
mpz_init_set_si(p, 1);
mpz_init_set_si(q, 1);
for i := 1 to 100 do
begin
p := p * i;
q := q * 2;
end;
p := p + q;
mp_printf('%Zd', [@p]);
end.
Объяснение кода листинга программы
- Объявлены переменные p, q типа mpz_t, предназначенные для работы с большими числами.
- Инициализированы переменные p, q значением 1.
- Задаётся цикл от 1 до 100.
- В каждой итерации цикла переменная p умножается на текущее значение i, а переменная q умножается на 2.
- После завершения цикла, значение переменной p увеличивается на значение переменной q.
- Используя функцию mp_printf, выводится на экран значение переменной p.