IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Возведение числа в БОЛЬШУЮ степень, Степень числа забивается в массив
Кит
сообщение 6.03.2005 12:57
Сообщение #1





Группа: Пользователи
Сообщений: 6
Пол: Мужской

Репутация: -  0  +


Помогите пожалуйста с програмкой реализации возведения числа в большую степень (30..200). smile.gif :low:
Реализация должна вроде с помощью записи чисел в массив
Но до меня чо то не доходит как это сделать
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
Ответов(1 - 19)
volvo
сообщение 6.03.2005 13:07
Сообщение #2


Гость






Читайте здесь: FAQ: Длинная арифметика
 К началу страницы 
+ Ответить 
SWEETY
сообщение 10.07.2006 17:25
Сообщение #3


Гость






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


Гость






Цитата(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 12:36
Сообщение #5


Гость






Volvo,огромное тебе спасибо kiss2.gif .Но сёдня ходила сдавать,он сказал,что алгоритм не понятен и почему ты уверенна,что результат правильный.Говорит,надо найти какую-то закономерность и сделать через case of . Я в тупике... mega_chok.gif
 К началу страницы 
+ Ответить 
volvo
сообщение 11.07.2006 13:22
Сообщение #6


Гость






Я не понял, тебе надо найти ВСЕ цифры числа 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 14:24
Сообщение #7


Гость






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


Гость






люди а как возвести 2006 в 2007 стпень.
и 2007 в 2006 степень.люди пожалуйста помогите.оч надо
 К началу страницы 
+ Ответить 
volvo
сообщение 19.10.2006 9:58
Сообщение #9


Гость






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


Вот результат ее работы:
Прикрепленный файл  long.txt ( 12.99 килобайт ) Кол-во скачиваний: 670
 К началу страницы 
+ Ответить 
Гость
сообщение 28.04.2007 20:31
Сообщение #10


Гость






Цитата(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
сообщение 28.04.2007 20:52
Сообщение #11


Гость






Цитата
а как 99 в степень 99 возвести?!?!?
Посмотреть на программу, присоединенную к посту №9, и поменять в ней основание и показатель степени на 99 ...
 К началу страницы 
+ Ответить 
Гость
сообщение 28.04.2007 20:56
Сообщение #12


Гость






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

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

смотрел- в паскале изменял- и всерно белеберда получается- можете исправить плиз?? give_rose.gif
 К началу страницы 
+ Ответить 
volvo
сообщение 28.04.2007 21:03
Сообщение #13


Гость






Может, ты покажешь, КАК именно пробовал изменять?
 К началу страницы 
+ Ответить 
Гость
сообщение 28.04.2007 21:05
Сообщение #14


Гость






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

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

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

че надо изменить чтобы 99 в степень 99 ввел?) я непонимаю если чесно)
ХЕЛПП)))
 К началу страницы 
+ Ответить 
Гость
сообщение 28.04.2007 21:21
Сообщение #15


Гость







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

Плиз помогите!!
 К началу страницы 
+ Ответить 
volvo
сообщение 28.04.2007 21:21
Сообщение #16


Гость






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

Сообщение отредактировано: volvo - 28.04.2007 21:22
 К началу страницы 
+ Ответить 
Гость
сообщение 28.04.2007 21:23
Сообщение #17


Гость






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

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


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

а это 99 в 100 степени! а надо в 99!!!
чето не прально решает . вот так.
 К началу страницы 
+ Ответить 
Гость
сообщение 28.04.2007 21:27
Сообщение #18


Гость






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


может ставить и тут также степень не 99 а 98 ??
 К началу страницы 
+ Ответить 
Гость
сообщение 28.04.2007 21:27
Сообщение #19


Гость






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


может ставить и тут также степень не 99 а 98 ??
 К началу страницы 
+ Ответить 
volvo
сообщение 28.04.2007 22:02
Сообщение #20


Гость






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


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


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

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 18:39
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"