Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Возведение числа в БОЛЬШУЮ степень

Автор: Кит 6.03.2005 16:57

Помогите пожалуйста с програмкой реализации возведения числа в большую степень (30..200). smile.gif :low:
Реализация должна вроде с помощью записи чисел в массив
Но до меня чо то не доходит как это сделать

Автор: volvo 6.03.2005 17:07

Читайте здесь: http://forum.pascal.net.ru/index.php?showtopic=2428

Автор: SWEETY 10.07.2006 21:25

А мне вот надо посчитать 2^500 с точностью до последней цифры,а я не могу.Почитала 'Длинную арифметику' и всё равно не могу !bye2.gif.ПОМОГИТЕ,ПОЖАЛУЙСТА СДЕЛАТЬ ЭТО...

Автор: volvo 10.07.2006 21:51

Цитата(SWEETY @ 10.07.2006 17:25)
Почитала 'Длинную арифметику' и всё равно не могу

Странно... У меня получилось:
uses crt;
const
_maxdig=1000;
_osn=10000;

type
Tlong=array[0.._maxdig]of integer;
Plong=^Tlong;

procedure WriteLong(var f:text;a:Plong);
var
ls, s: string;
i: integer;
begin
str(_osn div 10,ls);
write(f,a^[a^[0]]);
for i:=a^[0]-1 downto 1 do begin
str(a^[i],s);
while length(s)<length(ls) do s:='0'+s;
write(f,s);
end;
writeln(f);
end;

procedure MulLongShort(a:Plong;const k:longint;c:Plong);
var i: integer;
begin
fillchar(c^,sizeof(c^),0);
if k=0 then inc(c^[0]) else begin
for i:=1 to a^[0] do begin
c^[i+1]:=(longint(a^[i])*k+c^[i]) div _osn;
c^[i]:=(longint(a^[i])*k+c^[i]) mod _osn;
end;
if c^[a^[0]+1]>0 then c^[0]:=a^[0]+1 else c^[0]:=a^[0];
end;
end;

var
long_n1, long_n2: PLong;
i: integer;
console: text;

begin
long_n1 := new(plong);
long_n2 := new(plong);

long_n1^[0] := 1; long_n1^[1] := 1; { <-- long_n1 := 1 }
for i := 1 to 500 do begin
mullongshort(long_n1, 2, long_n2);
long_n1^ := long_n2^;
end;

assigncrt(console); rewrite(console);
writelong(console, long_n1);
close(console);

end.

Автор: Гость 11.07.2006 16:36

Volvo,огромное тебе спасибо kiss2.gif .Но сёдня ходила сдавать,он сказал,что алгоритм не понятен и почему ты уверенна,что результат правильный.Говорит,надо найти какую-то закономерность и сделать через case of . Я в тупике... mega_chok.gif

Автор: volvo 11.07.2006 17:22

Я не понял, тебе надо найти ВСЕ цифры числа 2^500, или только ПОСЛЕДНЮЮ цифру? Если только последнюю, то можно найти эту самую закогомерность, например, так:
2^500 = (2^5)^100 = ((2^5)^5)^20 = (((2^5)^5)^5)^4 =>

возводим в нужную степень только последнюю цифру, и получаем, что последняя цифра числа 2^500 =

(((32)^5)^5)^4 = ((32^5)^4) = (32)^4 = 16

Ответ: последняя цифра = 6 (что, кстати, и в моей программе получилось)

А вот если надо вычислить ВСЕ цифры - то тут никакой Case Of не поможет. Придется вычислять с использованием длинной арифметики...

Цитата
почему ты уверенна,что результат правильный.
А почему он сомневается, что результат правильный? Можно же на каждом шаге распечатывать промежуточные результаты, чтоб сомнений не осталось, что это именно степени двойки...

Автор: Гость 11.07.2006 18:24

ВСЕ.... Я нашла только закономерность 3-х последних цифр и кол-ва знаков.Программа должна быть для любой степени (10,250...500),через цикл for и case,но результат-строка,поэтому помещается в памяти.Он знает эту закономерность,а я нет и осталась неделя... sad.gif

Автор: Гость 19.10.2006 13:27

люди а как возвести 2006 в 2007 стпень.
и 2007 в 2006 степень.люди пожалуйста помогите.оч надо

Автор: volvo 19.10.2006 13:58

Цитата
а как возвести 2006 в 2007 стпень.
и 2007 в 2006 степень
Вот программа (когда она попросит ввести число, введи то, которое написано):
Прикрепленный файл  long.pas ( 2.05 килобайт ) Кол-во скачиваний: 1281


Вот результат ее работы:
Прикрепленный файл  long.txt ( 12.99 килобайт ) Кол-во скачиваний: 1060

Автор: Гость 29.04.2007 0:31

Цитата(volvo @ 10.07.2006 17:51) *

Странно... У меня получилось:
uses crt;
const
_maxdig=1000;
_osn=10000;

type
Tlong=array[0.._maxdig]of integer;
Plong=^Tlong;

procedure WriteLong(var f:text;a:Plong);
var
ls, s: string;
i: integer;
begin
str(_osn div 10,ls);
write(f,a^[a^[0]]);
for i:=a^[0]-1 downto 1 do begin
str(a^[i],s);
while length(s)<length(ls) do s:='0'+s;
write(f,s);
end;
writeln(f);
end;

procedure MulLongShort(a:Plong;const k:longint;c:Plong);
var i: integer;
begin
fillchar(c^,sizeof(c^),0);
if k=0 then inc(c^[0]) else begin
for i:=1 to a^[0] do begin
c^[i+1]:=(longint(a^[i])*k+c^[i]) div _osn;
c^[i]:=(longint(a^[i])*k+c^[i]) mod _osn;
end;
if c^[a^[0]+1]>0 then c^[0]:=a^[0]+1 else c^[0]:=a^[0];
end;
end;

var
long_n1, long_n2: PLong;
i: integer;
console: text;

begin
long_n1 := new(plong);
long_n2 := new(plong);

long_n1^[0] := 1; long_n1^[1] := 1; { <-- long_n1 := 1 }
for i := 1 to 500 do begin
mullongshort(long_n1, 2, long_n2);
long_n1^ := long_n2^;
end;

assigncrt(console); rewrite(console);
writelong(console, long_n1);
close(console);

end.



Эх- а как 99 в степень 99 возвести?!?!?

Автор: volvo 29.04.2007 0:52

Цитата
а как 99 в степень 99 возвести?!?!?
Посмотреть на программу, присоединенную к посту №9, и поменять в ней основание и показатель степени на 99 ...

Автор: Гость 29.04.2007 0:56

Цитата(volvo @ 28.04.2007 20:52) *

Посмотреть на программу, присоединенную к посту №9, и поменять в ней основание и показатель степени на 99 ...

смотрел- в паскале изменял- и всерно белеберда получается- можете исправить плиз?? give_rose.gif

Автор: volvo 29.04.2007 1:03

Может, ты покажешь, КАК именно пробовал изменять?

Автор: Гость 29.04.2007 1:05

Цитата(volvo @ 28.04.2007 21:03) *

Может, ты покажешь, КАК именно пробовал изменять?

в цикле вместо 1 to 2007 ставил 99 smile.gif)
я нюб да?)))

че надо изменить чтобы 99 в степень 99 ввел?) я непонимаю если чесно)
ХЕЛПП)))

Автор: Гость 29.04.2007 1:21


Плиззз)) очень срочно нужно возвести число 99 в степень 99 . И в результате должно быть целочисленный резыльт.
задачка такая что в делфи нерешаетца- а паскаль плохо знаю ) ы цикло зло.

Плиз помогите!!

Автор: volvo 29.04.2007 1:21

Ну, и с чего ты решил, что ответ

Цитата
36603234127322950493061602657251738618971207663892369140595737269931704475072474
81871965435100269504006615691006528432747182356968017994158571053544917075742738
9035006098270837114978219916760849490001
- неправильный?

Автор: Гость 29.04.2007 1:23

Цитата(volvo @ 28.04.2007 21:21) *

Ну, и с чего ты решил, что ответ
- неправильный?


у меня в делфи получалось
36603234127322950493061602657251738618971207663892369140595737269931704475072474
81871965435100269504\
00661569100652843274718235696801799415857105354491707574273890350060982708371149
78219916760849490001

а это 99 в 100 степени! а надо в 99!!!
чето не прально решает . вот так.

Автор: Гость 29.04.2007 1:27

в делфи когда цикл ставишь от 1 до 0 возведение в степень = 99
цикл от 1 до 1 = 9801 и т.д
т.е. если цикл = 1 to 3 do то в реале это полчается 99 в 4 степени


может ставить и тут также степень не 99 а 98 ??

Автор: Гость 29.04.2007 1:27

в делфи когда цикл ставишь от 1 до 0 возведение в степень = 99
цикл от 1 до 1 = 9801 и т.д
т.е. если цикл = 1 to 3 do то в реале это полчается 99 в 4 степени


может ставить и тут также степень не 99 а 98 ??

Автор: volvo 29.04.2007 2:02

Ну, правильно... Небольшое изменение:

  buffer^ := first^;
for i := 1 to pred(99) do begin { <--- Здесь !!! }
mullongtwo(first, buffer, T);
first^ := T^;
end;


и выдается результат:
Цитата
36972963764972677265718790562880544059566876428174110243025997242355257045527752
34214106500101282327279409788895483265401194299967694943594516215701936440144180
71060667659301384999779999159200499899


(результат проверен также и с использованием библиотеки DFF Library под Дельфи, то же самое, цифра в цифру)

Автор: Гость 29.04.2007 2:07

Цитата(volvo @ 28.04.2007 22:02) *

Ну, правильно... Небольшое изменение:
  buffer^ := first^;
for i := 1 to pred(99) do begin { <--- Здесь !!! }
mullongtwo(first, buffer, T);
first^ := T^;
end;


и выдается результат:
(результат проверен также и с использованием библиотеки DFF Library под Дельфи, то же самое, цифра в цифру)


Спасибо огромное)) give_rose.gif выручил ! спасибо спасибо спасибо спасибо спасибо спасибо спасибо спасибо спасибо спасибо спасибо спасибо спасибо спасибо спасибо спасибо спасибо спасибо)))

Автор: Гость 23.02.2017 17:53

Помогите, пожалуйста возвести 2017 в 2017 степень (2017^2017) со всеми знаками. Оч надо.

Автор: Федосеев Павел 23.02.2017 23:55

Так по совету volvo замените в той программе 2006 на 2017.

Автор: Гость 24.02.2017 19:59

Не получаете. Плиз, скажите просто ответ. Оч надо (2017^2017)

Автор: Федосеев Павел 25.02.2017 2:56

uses crt;
const
_maxdig=10000;
_osn=10000;

type
Tlong=array[0.._maxdig]of integer;
Plong=^Tlong;

procedure ReadLong(var f:text;a:Plong);
var ch:char;
i:integer;
begin
fillchar(a^,sizeof(a^),0);
read(f,ch);
while not (ch in ['0'..'9',#26]) do read(f,ch);
while ch in ['0'..'9'] do
begin
for i:=a^[0] downto 1 do
begin
a^[i+1]:=a^[i+1]+(longint(a^[i])*10)div _osn;
a^[i]:=(longint(a^[i])*10)mod _osn;
end;
a^[1]:=a^[1]+ord(ch)-ord('0');
if a^[a^[0]+1]>0 then inc(a^[0]);
read(f,ch);
end;
end;

procedure WriteLong(var f:text;a:Plong);
var
ls, s: string;
i: integer;
begin
str(_osn div 10,ls);
write(f,a^[a^[0]]);
for i:=a^[0]-1 downto 1 do begin
str(a^[i],s);
while length(s)<length(ls) do s:='0'+s;
write(f,s);
end;
writeln(f);
end;

procedure MulLongTwo(a,b,c:Plong);
var i,j:integer;
dv:longint;
begin
fillchar(c^,sizeof(c^),0);
for i:=1 to a^[0] do
for j:=1 to b^[0] do
begin
dv:=longint(a^[i])*b^[j]+c^[i+j-1];
c^[i+j]:=c^[i+j]+dv div _osn;
c^[i+j-1]:=dv mod _osn;
end;
c^[0]:=a^[0]+b^[0];
while (c^[0]>1) and (c^[c^[0]]=0) do dec(c^[0]);
end;

var
first, second, T, buffer: PLong;
i: integer;
console: text;

begin
first := new(plong);
second := new(plong);
t := new(plong);
buffer := new(plong);

assigncrt(console); reset(console);
write('-> 2017 '); readlong(console, first);
close(console);

buffer^ := first^;
for i := 2 to 2017 do begin
mullongtwo(first, buffer, T);
first^ := T^;
end;

assign(console, 'long.txt'); rewrite(console);
writeln(console, '2017 ^ 2017 = ');
writelong(console, first);
close(console);

end.