Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вычисление факториала в Pascal

Автор: OrlangurStep
Дата сообщения: 27.11.2006 14:30
Нужно точно вычислить факториал (факториал - x! = 1*2*3*4...*x) чиcла вплоть до 100! НО это число можно запихнуть минимум в 515 бит. Естественно в паскале такого типа нет (конешно кто в 83 году работал с 515 битными числами), как посчитать такой большой факториал (реализация обязательно в турбо паскале)?
Автор: vertex4
Дата сообщения: 27.11.2006 15:22
OrlangurStep
ab*cd = a*cd *10 + b*cd. В каком это классе проходят?
float сколько знаков?
соответственно, пока элемент меньше максимума - считаем. Промежуточные результаты сохраняем. И так далее
Кстати, это всё хорошо распараллеливается, но на pascal'е я это не смогу.
Автор: Qraizer
Дата сообщения: 27.11.2006 15:23
Можно выполнять вычисления "столбиком". Компилятор, когда работает c LongInt, так и делает. Естественно, зарезервировать нужное количество памяти придётся самому, например, массивом. Если массивом, то "столбик" можно реализовать циклом.
Автор: WiseAlex
Дата сообщения: 27.11.2006 18:04
http://pascal.sources.ru/math/longar.zip
http://sources.ru/qq.php?showtopic=72091
почитать http://algolist.manual.ru/maths/longnum.php
ну и самое главное - тема уже была:
http://forum.ru-board.com/topic.cgi?forum=33&topic=2755#1
Автор: rain87
Дата сообщения: 27.11.2006 19:11
OrlangurStep
по счастливой случайности надо было мне когда-то в далёком детстве считать 1000!
ну и того... [more=посчитал ]
Код: type tlargenumber=record
number:array[1..3000]of byte;
power:word;
end;
var fact:tlargenumber;
n:word;
i:word;
f:text;
procedure product(n:word);
var temp:tlargenumber;
i,p:word;
procedure add(n:word;power:word);
var t,s,d,e:byte;
first:word;
begin
t:=n div 1000;
s:=(n mod 1000)div 100;
d:=(n mod 100)div 10;
e:=n mod 10;
first:=1+power;
inc(temp.number[first],e);
inc(temp.number[first+1],d+(temp.number[first]div 10));
temp.number[first]:=temp.number[first]mod 10;
inc(temp.number[first+2],s+(temp.number[first+1]div 10));
temp.number[first+1]:=temp.number[first+1]mod 10;
inc(temp.number[first+3],t+(temp.number[first+2]div 10));
temp.number[first+2]:=temp.number[first+2]mod 10;
inc(temp.number[first+4],temp.number[first+3]div 10);
temp.number[first+3]:=temp.number[first+3]mod 10;
end;
begin
for i:=1 to 3000 do temp.number[i]:=0;
temp.power:=0;
p:=fact.power;
for i:=0 to p do
add(fact.number[i+1]*n,i);
if temp.number[p+4]<>0 then temp.power:=p+4
else
if temp.number[p+3]<>0 then temp.power:=p+3
else
if temp.number[p+2]<>0 then temp.power:=p+2
else
if temp.number[p+1]<>0 then temp.power:=p+1
else
temp.power:=p;
fact:=temp;
end;
begin
assign(f,'input.txt');
reset(f);
read(f,n);
close(f);
fact.number[1]:=1;
fact.power:=1;
for i:=2 to n do
begin
product(i);
writeln(i);
end;
assign(f,'output.txt');
rewrite(f);
for i:=fact.power downto 1 do write(f,fact.number[i]);
close(f);
end.
Автор: OrlangurStep
Дата сообщения: 27.11.2006 21:18
2 ALL
Ладно поглядим разберемся...
vertex4

Цитата:
В каком это классе проходят?

А я почем знаю, учусть в 11. Такое выражение я знаю, но это не сильно помогает при проганьиrain87

Цитата:
реализация длинной арифметики в самом дубовом её варианте

Да я вроде прогать умею, только столкнулся с этой проблемой в 1 раз, идей своих много хотелось и чужие мнения послушать.

Страницы: 1

Предыдущая тема: AnsiString & HEX


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.