Получить последовательность по правилу - Turbo Pascal (29435)
Формулировка задачи:
Получить последовательность dk, dk-1, ..., d0 десятичных цифр числа 100!-2^100, , т. е. такую целочисленную последовательность, в которой каждый член di удовлетворяет условию 0≤di≤9 и, дополнительно, dk∙10k+ dk-1∙10k-1+…+ d0=100!-2^100
Решение задачи: «Получить последовательность по правилу»
textual
Листинг программы
type
tNum = array [-1..255] of Byte;
procedure Mul(var N : tNum; v : Integer);
var
i, d : Integer;
begin
d := 0;
for i := 0 to N[-1] do begin d := d + v * N[i]; N[i] := d mod 10; d := d div 10; end;
while d > 0 do begin Inc(N[-1]); N[N[-1]] := d mod 10; d := d div 10; end;
end;
function Dec(a, b : tNum) : tNum;
var
r : tNum;
i, d : Integer;
begin
d := 0;
for i := 0 to a[-1] do
begin
Inc(d, a[i]); if i <= b[-1] then dec(d, b[i]);
if d < 0 then begin r[i] := (d + 10) mod 10; d := -1; end
else begin r[i] := d mod 10; d := 0; end;
end;
r[-1] := a[-1]; while r[r[-1]] = 0 do Dec(r[-1]);
Dec := r;
end;
procedure WriteNum(N : tNum);
var
i : Integer;
begin
for i := N[-1] downto 0 do Write(N[i]); WriteLn;
end;
var
f, d : tNum;
i : Integer;
begin
f[-1] := 1; f[0] := 1; d[-1] := 1; d[0] := 1; { это единички: 1! и 2^0 }
for i := 1 to 100 do begin Mul(f, i); Mul(d, 2); end;
WriteNum(Dec(f, d));
end.
Объяснение кода листинга программы
- Создается тип данных tNum, представляющий массив byte от -1 до 255.
- Определяется процедура Mul, которая умножает переменную N на число v и обновляет соответствующие элементы массива N.
- Определяется функция Dec, которая делит переменную a на b и возвращает результат в виде нового массива.
- Определяется процедура WriteNum, которая записывает элементы массива N в стандартный поток вывода.
- Создаются две переменные типа tNum: f и d.
- Задаются начальные значения для переменных f и d: f[-1] = 1, f[0] = 1, d[-1] = 1, d[0] = 1. Это единицы, соответствующие числам 1! и 2^0.
- Запускается цикл, в котором умножаются элементы массива f на числа от 1 до 100 и затем умножаются элементы массива d на число 2.
- После завершения цикла вызывается функция Dec, которая делит массив f на массив d.
- Наконец, вызывается процедура WriteNum, чтобы записать результат в стандартный поток вывода.