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

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

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

> факториалы больших чисел
sqrt
сообщение 19.12.2004 1:45
Сообщение #1





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

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


Требуется найти факториалы всех чисел от 1 до 100. Стандартный цикл не канает, т.к. в longint не влезет факториал ста... Есть подозрение что это можно реализовать рекурсией, но как? Что делать???
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
xds
сообщение 22.12.2004 1:38
Сообщение #2


N337
****

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

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


shr offtop,1
В детстве баловался:

Код
program FuckToReal;

const DataSize = 16384;
     ResultSize = 60000;

type PResult = ^TResult;
    TResult = array[0..0] of Char;

var Data: array[0..DataSize - 1] of Word;
   Result: PResult;
   Digits, N: Integer;
   SymbolIndex, i: Word;

begin
 GetMem(Result, ResultSize);
 Write('N>');
 Readln(N);
 FillChar(Data, SizeOf(Data), 0);
 Data[0] := 1;
 Digits := 1;
 Write('Calculating... ');

 { Calulating of factorial by long binary multiplication }
 asm
   push bp
   mov bp,N
 @@NextPass:
   push ds
   pop es
   lea si,Data
   mov di,si
   cld
   xor bx,bx
   mov cx,Digits
 @@NextDigit:
   lodsw
   mul bp
   add ax,bx
   adc dx,0
   stosw
   mov bx,dx
   loop @@NextDigit
   or bx,bx
   jz @@Exit
   inc Digits
   mov cx,1
   jmp @@NextDigit
 @@Exit:
   dec bp
   cmp bp,1
   ja @@NextPass
   pop bp
 end;
 Writeln('Done');
 Write('Converting...  ');

 { Building a decimal representation of long binary number }
 SymbolIndex := ResultSize;
 asm
   push bp
   mov bp,Digits
   dec bp
   shl bp,1
   lea bp,Data[bp]
   les di,Result
   add di,ResultSize-1
   mov bx,10
   std
 @@NextSymbol:
   xor dx,dx
   mov si,bp
   cmp [si],bx
   jae @@NextDigit
   sub bp,2
 @@NextDigit:
   lodsw
   div bx
   mov [si+2],ax
   cmp si,offset Data
   jae @@NextDigit
   mov al,dl
   add al,'0'
   stosb
   dec SymbolIndex
   cmp bp,offset Data
   jae @@NextSymbol
   pop bp
 end;
 Writeln('Done');
 for i := SymbolIndex to ResultSize - 1 do Write(Result^[i]);
 Writeln;
 FreeMem(Result, ResultSize);
end.


Считала 10000! (с точностью до едениц) на Pentium 100 MHz за 37 секунд.


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


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

 



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