Вход


Главная страница >> Учебный процесс >> Задачник >> Олимпиадные задачи (с решениями) >> Учебный процесс >> Задачник >> Олимпиадные задачи (с решениями) >> Арифметика >> Номер 19

[Назад]    [Содержание ]    [Вперед]

  


Номер 19


  Условие: Номер 19


Задача 18. Вывести на экран число 2n, n<=10000, n - натуральное.

  Решение задачи: Номер 19


Решение задачи 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. { программы }

Назад



[Назад]    [Содержание ]    [Вперед]

  


  
За содержание страницы отвечает Гончарова М.Н.
©
Кафедра СПиКБ, 2002-2017