Решение задачи 18.
В переменной стандартного типа такое большое число не поместится. Будем моделировать возведение 2 в степень n вычисляя последовательно 21, 22, ... , 2n, используя массив. В каждой ячейке массива будем хранить по (например) 4 десятичных цифры числа (т.е. в элементе A[1] - 4 последних цифры числа (разряды 0 -3), в A[2] - 4 предпоследних (разряды 4 - 7) и т.д.).
Оценим количество десятичных цифр в числе 2n, n<=1000. Это 10 000 * log10(2) + 1 < 15 000 цифр. Количество элементов массива возьмем равным 15000/4=3750. Введем переменную Nach, в которой будем хранить индекс элемента массива A, в котором находятся старшие значащие разряды вычисляемого сейчас числа.
var A: array[1 .. 3750] of word;
Nach: word;
I,N,j: word;
begin
for i:=2 to 3750 do A[i]:=0;
A[1]:=1; { сначала число в массиве A - это 20=1 }
read(N); { читаем степень }
Nach:=2; { индекс первой еще не использованной ячейки }
{ в массиве A }
for i:=1 to N do
begin
Perenos:=0; { перенос в следующий элемент массива A }
for j:=1 to Nach+1 do
begin
A[i]:=A[i]+A[i]+Perenos;
{ складываем 4 текущих разряда друг с другом, }
{ добавляя перенос из предыдущих 4-х разрядов }
if A[i]>=10000 { если в числе > 4 цифр }
then begin
Perenos:=A[i] div 10000; {то формируем перенос}
{ в старшие разряды }
A[i]:=A[i] mod 10000; { и оставляем в числе }
{ 4 последних цифры }
end
else Perenos:=0 { иначе переноса нет }
end; { к вложенному циклу for j }
if A[Nach+1]>0 { если был перенос в еще не }
then Nach:=Nach+1; { использованную ячейку }
{ массива A, то увеличиваем Nach }
end; { для цикла for i }
{ распечатка }
{ старшая тетрада печатается без ведущих нулей }
j:=1000; { ищем первую значащую цифру }
while (A[Nach] div j)=0 do j:=j div 10;
while j<>0 do begin
write(A[Nach] div j); { печать цифры }
A[Nach]:=A[Nach] mod j; { отбрасываем }
j:=j div 10; { напечатанную цифру }
end;
for i:=Nach-1 downto 1 do
begin
j:=1000;
for j:=1 to 4 do { 4 разряда }
begin
write(A[i] div j); { печатаем цифру }
A[i]:=A[i] mod j; { и отбрасывает ее }
j:=j div 10;
end
end
end. { программы }
|