StudClub — студентський клуб Полтави
Форум › Задачи › Возвести в степень

Возвести в степень

Автор: Kerz · 25.10.2026 17:57 · 10 відповідей · 8 617 переглядів

K
28.09.2006 16:21
Вывести на экран число 2 в степени n, n<=10000, n - натуральное.
10.10.2006 11:38
А нам как, на Паскале или на СИ. Или просто алгоритм, структуру программы.
K
10.10.2006 12:20
как угодно. любой язык, не в нём суть
10.10.2006 16:52
Эх... Здул пыль со старых книжек по Паскалю. И вот что вышло:

program stepen;
var s:real;
i,n:integer;
begin
s:=1;
writeln('Введите значение степени меншье или равно 10000');
readln(n);
if (n<=10000) and (n>1) then
begin
for i:=1 to n do
begin
s:=s*2;
end;
writeln('Ответ ',s);
end
else
if n=1 then writeln('Ответ ',2) else
begin
writeln('Вы ввели число больше 10000 или меньше 0')
end;
readln;
end.


Примитивно, понимаю. Но по другому не умею.
Считает до 126 степени. Как зделать до 10000, не знаю. Real поддержует где-то до 38 знака после запятой.
K
11.10.2006 10:15
Это не решение.
Немного разъясню что к чему: суть задачи - вычислить очен большое число, которое нельзя хранить в переменной стандартного типа. Нужно организовать хранение результата, например, в массиве. Скажем, в каждой ячейке массива хранить по 4 разряда числа.

Давайте варианты
11.10.2006 14:42
Ну так так бы и сразу. Кстати, интересная задача.
11.10.2006 14:57
Если я тебя правильно понял, то программа должна постоянно обращаться к массиву и множить по принципу - в столбик. А если например взять трехзначное число.
11.10.2006 15:22
Все... крышу сносит [sm35] Напиши пожалуйста решение... [sm5] [sm5] [sm5] [sm5] [sm5]
K
11.10.2006 15:28
Погоди ))
Может кто-то предложит решение..
13.11.2006 15:59
Где решение? Сколько можно ждать.
K
23.11.2006 03:57
Цитата:

В переменной стандартного типа такое большое число не поместится. Будем моделировать возведение 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. { программы }

Увійдіть, щоб відповісти в темі.