Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 17:21

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 13 ] 
Автор Сообщение
 Заголовок сообщения: *вычисление факториала разными способами
СообщениеДобавлено: Сб фев 06, 2010 09:25 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
найти факториал числа, результат должен быть двойной длины.
решения должны быть разными!(интересно, сколько найдется интересных способов решения 8)
: fact ( u --> ud )
;


впрочем, решения для чисел с плавающей точкой, а так же для "длинных" чисел так же приветствуются!


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб фев 06, 2010 12:20 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Цитата:
Факториа́л числа n (обозначается n!, произносится эн факториа́л) — произведение всех натуральных чисел до n включительно:
.

По определению полагают 0! = 1. Факториал определён только для целых неотрицательных чисел.

http://ru.wikipedia.org/wiki/Факториал

Цитата:
решения для чисел с плавающей точкой
?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб фев 06, 2010 12:30 
Не в сети

Зарегистрирован: Сб янв 26, 2008 18:23
Сообщения: 71
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Код:
: N! ( n --n!) dup 0= IF drop 1 S>D
                               ELSE    1 S>D rot DO i S>D D* LOOP
                               THEN ;


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб фев 06, 2010 13:11 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
мой вариант для форка:
branch/ for-next.fts
memory/ double.fts
math/ double.fts

\ произведение # чисел, получаемых с помощью xt
: П ( # xt --> d )
A>L NOW 0`1 SINCE
R@ AL@ EXECUTE -ROT SD*
TILL
ALDROP ;

: fact ( # --> ) ' NOOP П D. ;

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб фев 06, 2010 15:51 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Код:

Код:
\ write by WingLion  admin@winglion.ru
\ для fork410233

\ подключение нужных деталей

branch/ doloop.fts
math/ double.fts

HEX \ ну вот, привык я в HEX-е работать!

CREATE Ftab 100 ALLOT ;CREATE  \ резервируется 256 байт под 32 табличных значения
Ftab 100 ERASE \ инициализация таблицы нулями, на всякий случай, а бес его знает, зачем...

: Ftab[]  ( i -> adr ) \ расчет адреса в массиве
1F AND \ ограничитель на номер массива больше 20! все равно в двойное целое не влезет
8 * Ftab + ; \ вычисление адреса
: Ftab[]@ Ftab[] D@ ; \ получение результата из таблицы ( без ограничений на индекс )

1 S>D 0 Ftab[] D! \ инициализировать нулевой элемент таблицы единицей
\ инициализировать таблицу по схеме f(i) = i*f(i-1)
: init 1F 1 DO I 1 - Ftab[]@ I S>D D* I Ftab[] D! LOOP ;
init

\ вычисление факториала
: fact DUP 14 < IF Ftab[]@ ELSE \ для аргумента от 0 до 20 взять из таблицы
-1 S>D THEN \ если результат вылезает за сетку выдается -1
;

: test 1F 0 DO I . ." ! = " I fact D. CR LOOP ;

DECIMAL \ хотите результат в десятичном виде - пожалуйста!
test



результат:
Код:
0 ! = 1
1 ! = 1
2 ! = 2
3 ! = 6
4 ! = 24
5 ! = 120
6 ! = 720
7 ! = 5040
8 ! = 40320
9 ! = 362880
10 ! = 3628800
11 ! = 39916800
12 ! = 479001600
13 ! = 6227020800
14 ! = 87178291200
15 ! = 1307674368000
16 ! = 20922789888000
17 ! = 355687428096000
18 ! = 6402373705728000
19 ! = 121645100408832000
20 ! = -1
21 ! = -1
22 ! = -1
23 ! = -1
24 ! = -1
25 ! = -1
26 ! = -1
27 ! = -1
28 ! = -1
29 ! = -1
30 ! = -1

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб фев 06, 2010 16:52 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
WingLion писал(а):
\ инициализировать таблицу по схеме f(i) = i*f(i-1)
: init 1F 1 DO I 1 - Ftab[]@ I S>D D* I Ftab[] D! LOOP ; init


в форке в данном случае можно писать просто:
0x1F 1 DO I 1 - Ftab[]@ I S>D D* I Ftab[] D! LOOP


WingLion писал(а):
HEX \ ну вот, привык я в HEX-е работать!

ну, тогда надо писать:
HEX always

тогда даже после возникновения ошибки основание системы счисления останется в HEX

вопрос писал(а):
По определению полагают 0! = 1. Факториал определён только для целых неотрицательных чисел.

для отрицательных тоже определен, и для нечетных чисел получается отрицательным, а для четных положительным.
Но, это не значит, что с помощью float нельзя работать с целыми числами, не так ли? :D

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб фев 06, 2010 17:13 
Не в сети

Зарегистрирован: Сб янв 26, 2008 18:23
Сообщения: 71
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
1*2*3*4*5*6*7*8*9= (1*2*3*4) * (5 *6 *7 * 8 *9) = (1*2) * (3*4) * (5*6) * (7*8 ) * 9


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб фев 06, 2010 17:21 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
еще одно решение, уже с вариантом "ленивых вычислений"
branch/ for-next.fts
memory/ double.fts
math/ double.fts

\ массив-список значений факториала
USER-CREATE FactArr 21 DOUBLES USER-ALLOT \ всего-то 21 значение включая 0

\ найти n! . результат число двойной длины d
: fact ( n --> d ) *IF 0:1 ROT ABS FOR R@ ROT ROT SD* TILL ;THEN 0 ;

\ более быстрый вариант факториала за счет кеширования уже найденных значений
: FACT ( n --> d )
*IF ELSE 1 ;THEN \ 0 - особый случай
DUP >L FactArr D[@] DDUP OR IF LDROP ;THEN DDROP
L@ 21 < IF L@ fact DDUP L> FactArr D[!] ;THEN
ERROR" значение факториала превышает double" ;

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Последний раз редактировалось mOleg Вс фев 07, 2010 13:52, всего редактировалось 1 раз.

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс фев 07, 2010 13:37 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Код:
: dn* ( d n -- d )   TUCK * >R  UM* R> + ;

: fact ( n -- d )    >R 1. R> 1+ 1 DO I dn* LOOP ;

: fact.  1 DO I fact CR D. LOOP ;
21 fact.


LOG
Код:
1
2
6
24
120
720
5040
40320
362880
3628800
39916800
479001600
6227020800
87178291200
1307674368000
20922789888000
355687428096000
6402373705728000
121645100408832000
2432902008176640000
Ok

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс фев 07, 2010 14:17 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
значения-то можно и не вычислять:
\ список значений факториала
CREATE farr 0`1 D, 0`2 D, 0`6 D, 0`24 D, 0`120 D, 0`720 D, 0`5040 D, 0`40320 D,
0`362880 D, 3`628800 D, 3`9916800 D, 4`79001600 D, 6`227020800 D,
8`7178291200 D, 1`307674368000 D, 2`0922789888000 D, 3`55687428096000 D,
6`402373705728000 D, 1`21645100408832000 D, 2`432902008176640000 D,

\ нахождение факториала числа
: Fact ( u --> ud )
1 - -IF ERROR" Определено только для положительных чисел!" THEN
20 OVER > IF DOUBLES farr + D@ ;THEN
ERROR" Переполнение разрядной сетки!" ;

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт фев 09, 2010 11:15 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
"Длинные" факториалы

Код:
17 VALUE nbyte ( 17*32=544 разряда)
0 VALUE ct

: UQ* ( Q1 .... Qnbyte n -- Q1 .... Qnbyte )
TUCK * >R
nbyte 2- TO ct BEGIN TUCK UM* 2>R ct 1- TO ct ct 0= UNTIL
UM*
nbyte 2- TO ct BEGIN 0 2R> D+ ct 1- TO ct ct 0= UNTIL
R> + ;

: fact  1+ >R 1 nbyte 1 DO 0 LOOP R> 1 DO I UQ* LOOP ;

\ вывод длинных чисел с простейшим форматным преобразованием для base=hex
: fact.
1+ 1 DO I CR DUP 3 .0 ." ! = " fact
        nbyte 0 DO HEX 8 .0 DECIMAL LOOP
     LOOP ;

100 fact.

LOG
Код:
001! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
002! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002
003! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006
004! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018
005! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000078
006! = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002D0
007! = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013B0
008! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009D80
009! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058980
010! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000375F00
011! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002611500
012! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001C8CFC00
013! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017328CC00
014! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000144C3B2800
015! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013077775800
016! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000130777758000
017! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001437EEECD8000
018! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016BEECCA730000
019! = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001B02B9306890000
020! = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021C3677C82B40000
021! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002C5077D36B8C40000
022! = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003CEEA4C2B3E0D80000
023! = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057970CD7E2933680000
024! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083629343D3DCD1C00000
025! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CD4A0619FB0907BC00000
026! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014D9849EA37EEAC91800000
027! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000232F0FCBB3E62C3358800000
028! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003D925BA47AD2CD59DAE000000
029! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006F99461A1E9E1432DCB6000000
030! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D13F6370F96865DF5DD54000000
031! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001956AD0AAE33A4560C5CD2C000000
032! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000032AD5A155C6748AC18B9A580000000
033! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000688589CC0E9505E2F2FEE5580000000
034! = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DE1BC4D19EFCAC82445DA75B00000000
035! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001E5DCBE8A8BC8B95CF58CDE17100000000
036! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044530ACB7BA83A111287CF3B3E400000000
037! = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009E0008F68DF506477ADA0F38FFF400000000
038! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001774015499125EEE9C3C5E4275FE3800000000
039! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000392AC33E351CC7659CD325C1FF9BA8800000000
040! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008EEAE81B84C7F27E080FDE64FF05254000000000
041! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016E39F2C684405D62F4A8A9E2CD7D2F74000000000
042! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003C1581D491B28F523C23ABDF35B689C908000000000
043! = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A179CCEB478FE12D019FDDE7E05A924C458000000000
044! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001BC0EF38704CBAB3BC477A23DA8F91251BF20000000000
045! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004E0EA0CEBBD7CD1981890784D6B3C8385E98A0000000000
046! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E06A0E525C0C6DA95469F59DE944DFA20FF6CC0000000000
047! = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000293378A11EE64822167F7417FDD3A50EC0EE4F740000000000
048! = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000007B9A69E35CB2D866437E5C47F97AEF2C42CAEE5C00000000000
049! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000017A88E4484BE3B6B92EB2FA9C6C087C778C8D79F9C00000000000
050! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000049EEBC961ED279B02B1EF4F28D19A84F5973A1D2C7800000000000
051! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000EBA8F91E823EE3E18972ACC521C1C87CED2093CFDBE800000000000
052! = 00000000000000000000000000000000000000000000000000000000000000000000000000000002FDE529A3274C649CFEB4B180ADB5CB9602A9E0638AB2000000000000
053! = 0000000000000000000000000000000000000000000000000000000000000000000000000000009E90719EC722D0D480BB68BFA3F6A3260E8D2B749BB6DA000000000000
054! = 0000000000000000000000000000000000000000000000000000000000000000000000000000217277F77E01580CD32788186C96066A0711C72A98D891FC000000000000
055! = 00000000000000000000000000000000000000000000000000000000000000000000000000072F97C62C1249EAC15D7E3D3F543B60C784D1CA26D6875D24000000000000
056! = 0000000000000000000000000000000000000000000000000000000000000000000000000192693359A4002B5A4C739D65DA6CFD2BA50DE4387EED9C5FE0000000000000
057! = 00000000000000000000000000000000000000000000000000000000000000000000000059996C6EF58409A71B05BE0BADA2445EB7C017D09442E7D158E0000000000000
058! = 0000000000000000000000000000000000000000000000000000000000000000000000144CC291239FEA2FDC1F4D0EA556C37D75A18565419728856E22C0000000000000
059! = 0000000000000000000000000000000000000000000000000000000000000000000004ADB0D77335DAF907BB36C2601AFF0DEA1C39BE561DD656C0620240000000000000
060! = 0000000000000000000000000000000000000000000000000000000000000000000118B5727F009F525DCFE0D58E8653C742DE9D889C2EFE3C5516F88700000000000000
061! = 00000000000000000000000000000000000000000000000000000000000000000042E33C484325F6A05A8892E2F601F67AEF0B898D373294604679382B00000000000000
062! = 000000000000000000000000000000000000000000000000000000000000000010330899804331BAD5ED1392F79479B1C5E4CB50335E3FEF51115B9A6A00000000000000
063! = 0000000000000000000000000000000000000000000000000000000000000003FC8F1DC690893CFAA557D12AED89F2BFB34E08BCA431BBE4F3458B001600000000000000
064! = 00000000000000000000000000000000000000000000000000000000000000FF23C771A4224F3EA955F44ABB627CAFECD3822F290C6EF93CD162C0058000000000000000
065! = 00000000000000000000000000000000000000000000000000000000000040C815A3DAACB61EE8FED306F99401A8AB21B40DF96C282D48712A12C1658000000000000000
066! = 000000000000000000000000000000000000000000000000000000000010B395943E6086F3F811B267CC58286D7C1EB06B9A4DE25BACAD2CD8D5DC2B0000000000000000
067! = 00000000000000000000000000000000000000000000000000000000045F0025CC534351D9ECA1B12A7B1294A77C082C2962623DFE3152BCBFF89F410000000000000000
068! = 00000000000000000000000000000000000000000000000000000001293C0A0A461DE1BDE2DAF30F48B0EF7C7CF22BBAFE2218778519FA22FE0A4D440000000000000000
069! = 000000000000000000000000000000000000000000000000000000501D2EB4C4E60DD82E2503831E97B08C8DAD45C9667F309836E0006B6E78C6D3540000000000000000
070! = 000000000000000000000000000000000000000000000000000015E7FAC56DD6E7C91C9E1EF5DA5D7A466EBD61151206C7499F01401D6035065DC8F80000000000000000
071! = 000000000000000000000000000000000000000000000000000613568CC1769A48C6EFDA962F8FECE988B685ECD7FFE1456B1958C825AEB4C402BCC80000000000000000
072! = 00000000000000000000000000000000000000000000000001B5705796695B6477F3757A3D607AA1AE7355AA9CBFF75B861F20F84A9922D720C518400000000000000000
073! = 0000000000000000000000000000000000000000000000007CBD08F9E40B0FA6346C7FDB8082F81ABEE36DA6B2BD89193EE066CD45AAEF585833EA400000000000000000
074! = 0000000000000000000000000000000000000000000000240EA4983BEB32860B275CF57325DBB7BB2DBDB22FAAC9A14C2CDDB75623692F897F01B6800000000000000000
075! = 000000000000000000000000000000000000000000000A904A38998DE7CD4544883BE8BC175ED3D6669333F70912415124F4B63C5FD0ED48358077800000000000000000
076! = 0000000000000000000000000000000000000000000322D608CD9620D0F0905871C917D6F026E3A673B36D56B16B6416F8A619EC7206716FE2237A000000000000000000
077! = 000000000000000000000000000000000000000000F17A60A5D627DED85B6A9A397C2BA63BB27910CCF7E3135D4D1AE8C9F5CC1E4BF01EA704ABB2000000000000000000
078! = 000000000000000000000000000000000000000049934972874025E5EBDA7AFD83D54CA63060E31E73872FE66D7E32ED88E4313B232956E36C503C000000000000000000
079! = 0000000000000000000000000000000000000016B473AA57BCCBB1F3C86BF43BAED2A748EDE61665A6B7C81BC9F1B74D3E6B313FD9C1D02E6CC284000000000000000000
080! = 000000000000000000000000000000000000071864253B6AFFA79C2EA1BC52A6A1D446CA57E6FFC4196E88AF1B894823817F63F40C910E81FCC940000000000000000000
081! = 0000000000000000000000000000000000023EB7AFC7CCDAE4086AC12C9626B9342A6605D016ED0C0BF93F67B66FD33BF94EA037F9E59720FBAD40000000000000000000
082! = 0000000000000000000000000000000000B816D64DFF9E1D0AB231E048186752B594ADDCA757EDDBD5D64F386FD1A935DB2F51EE0B8A68909D7E80000000000000000000
083! = 000000000000000000000000000000003BAF677B49E0436A77C62BB75FE97FD0DF345E8A41821E46547BAF4C40F9DC761057902DBDDFE6E3100380000000000000000000
084! = 00000000000000000000000000000013958DF4743D961EEF4D06582B789DF0893D2F055D7EB1EF13B895850551FC56BD5CBB4F024D77C281412600000000000000000000
085! = 00000000000000000000000000000680A8222A9872D84574931B466F0C70DD91509CC80B1114618C49A52AC438C8CCDFCA313BC3B8C394EAA19E00000000000000000000
086! = 00000000000000000000000000022F387B7A4F3694A755296B29A94E2DEA6ED114AB33B7BCD8C520BD7C5DEB1374D32DEC8A13C011B406D24B1400000000000000000000
087! = 00000000000000000000000000BE0C31F690EB8C84DDF1136B2889919AABA90E062E93712DAAFE206543EAE39CB3C49B62ECB646042E517783CC00000000000000000000
088! = 0000000000000000000000004154312CC1D0F84DAC4ADEACD5EF4A0D2B021CD22002AEE7B2C75B22CF58BE3DDDCB956A015EA8116FEC01154E2000000000000000000000
089! = 000000000000000000000016B645188F61A65300E6076A166030BE93F3BC050D20EECE8D274EAF1A15DA23821BC6F1DA79E86E0FE90C6068292000000000000000000000
090! = 0000000000000000000007FC144AA26854792E50DE9B4BDDD1230003B019C69D93F49D9FD1A98F2BAEB07BBDC3F106CEDBB6B197EE59E49E754000000000000000000000
091! = 00000000000000000002D69B3687BB16071376BF2133F7D95771014F99299A0397F407CF8745E48718BBFC74A6AD6B8819F12101B9F44453ADC000000000000000000000
092! = 000000000000000001051FC798C73BEA8AFEACAFEEAD121B6C9C789B0AF3594A9BB2CE949D1E208CE38EB9EBE652A4E952A7DC9ED3C88E12710000000000000000000000
093! = 00000000000000005EDC8B828060C4347E84BBE9B4DF93F674D7D052FA67701A8FF50BFD13F1D32EAAD98AB2AC05E8C306FB25B2EFDB9CB30D0000000000000000000000
094! = 0000000000000022D4FB39EB23880B4674BCFFD06A18547EE73E7E77F1FB29C0DBFA66ED52CB8B22BBE0ED9B2A2B779C9037D7B412A389BEC60000000000000000000000
095! = 0000000000000CED093A7E422F7C2F255222EE575F075B17D030EE82CC347E91A1EC3211B988A1E3B8782C94A621631984B90BD2EAB01DCB7A0000000000000000000000
096! = 000000000004D8E375EF58D1CE91ADFECD1960C3A2C228EE1259710C93AF769CB892C6A5933CB5652D10B7BE4C852991C5646F18020B2C4DC00000000000000000000000
097! = 0000000001D62E2FAFB0A77F4532ED8BB69DAA20AB918234F3E3D5C3F57BF161EF9D44BCCA00BB5613559F1AFE74C03BCB0E1818C63BC975C00000000000000000000000
098! = 00000000B3FDAE4141A01EB87D7EEF7BE85B2081ADB3D8455D37D503F972677DBA3450455447B6F366C6E85568B196E3BB65397BE2E31F13800000000000000000000000
099! = 000000459B1A633C60EBE15888169CEADB3D92262C8CA2D30C976089773E059F023B0ACF97BBC020BEEBD9077CAD5A1178253AE8BDD5048A800000000000000000000000
100! = 00001B30964EC395DC24069528D54BBDA40D16E966EF9A70EB21B5B2943A321CDF10391745570CCA9420C6ECB3B72ED2EE8B02EA2735C61A000000000000000000000000
Ok

пс.
разрядность может быть любая - только смотреть неудобно и долго считается,
да и еще может не хватить глубины стека параметров. :)
Код:
: Nh. nbyte 0 DO HEX 8 .0 DECIMAL LOOP ;
270 TO nbyte CR 1000 fact Nh. \ здесь число nbyte не должно превышать максимальной глубины стека в ячейках(в СПФ глубина около 1000).

для 1000!
Код:
0000000000000000000000000002A2A773338969B740DE6E2B291FD8DD6EE62A2B41525AB61CBE52489B6CF344C23231711B6D9F34E0F13AB50EAF1AD3DD92771EC26B4B9EA804
11C866B1CCBD855F8326EDAB10832755E1682D3E7A91335E3670329BC1571B5208D72F7D6BE81483A6E6708ABF913B789F41838E9A73C1BA82E3A956570405A660A17E1125838BC810C
8D2C63915481914EA202867A563A41B6AEFEF5FEAC300A78803A30EB995208842EBEBA8729397A8CD9087E28FB155A3DE0F18DD90E64A9293AF6487A5AABDAB855FA254FCBDC9F11160
60BC2E2B4410E55E7368B844D9BF0AECA92DEB017DEF69AF777E8D4EDB1F1B926AE01DF3366ABB9E4568FC08FE255B68BCA0E48382A8E6DF1C7B0BA33BC2225CC512B39176A26B13098
E733E51417224BE36FBD933A8A7D98A08F356CF010F0FC59B9F1E32D3FB43209A82FA0E7F69E302FCB0F20362B86CBBEB08B81B1BA07F08AB119CE5E092D09996B710588779327D91EE80
EB679A99F0FDCA7EB4A50EF174295E94D590E3CF8BF37D23E5B22DCD79A4AC2C1EA7D1D55170789FCD2FCBB3EA52EAD4F7116F862578F5E22421C90CD0A7EE095903150631F273051914
29A54CACE66DD076C51A94034B31BEBEC406EE460181225E03A9A22C51E6A2A8DB4A94FD352605115CAF251B14DF0CEC523C48B79B58B0FC0676792D38A0D61523EB75F5CBC33EBDA1B
19933878CE7050356BD228CE9327A9916F9FF3BB5B6BEEDFE5382B861D6C4DA52A9754B6FEEC8A99372B43AFA7808836D281C5B2CDF791CF76D6C737AAD32C5ED7475855FC15C3F45C47
05DD0D6B4078656D027CFEE6F37772E03C35C0DCBBDAA25EA64D6865C87CAC0A9A999EB88D7A16515811A77192071189C353C1E72242A4F3106CEF2BAD1075549B4EFD6885690F3F58C1
F4686951CC543118428EC653E3C6FBDB427930F624680672C1E70C25DB7E7B67016A95B30DBA56D0083759EAC93A8E4D0C54853AA43F197B96FD70696AE5750D7D1F0427B8DBCFAFC8B9
924D51340FBF71BC22780FBA76525F5E5B91A2461983B60BF087DFDD89DCBC6F7892D9E4C5D55D106D45F77E4FC1C44A376D693BFB8B160F12ED1BDF5F4F1127E61D9DEC2DC1BBA43A6F
F47D294DE7A67CDF3EF90937667092517E985642D195031C6F5339C1CEA607A699C55E75C5479CBD30DDACCAB307472AA67A6A9A547D7E1EBA123144193E6D2933556DDEB516151EACF0
B48CE08892236ABFB74BF0CEE3A0E45997301027F2A53990697694F14DE4FAC0C908EEAEEDF3DBB45C4CE9F744FEF88EC1068C52056B16DA099E1FB620BD90DE25534B5E820B367A400000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср фев 10, 2010 17:26 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Слова повторного исполненения слов - некая замена типовым циклам

Код:
: t-rep { a } 0 DO a EXECUTE LOOP ;

: NOTFOUND  2DUP
S" nrep" COMPARE 0<> IF NOTFOUND EXIT THEN 2DROP
NextWord SFIND DROP
STATE @ 0= IF t-rep ELSE LIT, POSTPONE t-rep THEN ;

\ применение:  4 nrep WORD ( код слова WORD будет исполнен 4 раза)

\ и применительно к факториалу
: (!)  SWAP 1+ TUCK * ;

: fact ( n -- n!)
0 1 ROT nrep (!) NIP ;

5 fact
120
Ok

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: *вычисление факториала разными способами
СообщениеДобавлено: Сб июл 23, 2011 08:52 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
Не стал переделывать алго для чисел двойной точности ибо изюминка не в ней.
Код:
\ Организация суперциклов - рекурсивной конструкции START..?DIVE..EMERGE
\ , где START и EMERGE ограничивают функцию, ?DIVE снимает слово со стека
\ и если оно "истина" вызывает функцию рекурсивно

\ Определим вспомогательные слова :
: (START) R> DUP @ >R CELL+ >R ;
: (?DIVE) R> TUCK CELL+ >R IF @ >R ELSE DROP THEN ;

\ Определим слова конструкции :
: START  POSTPONE (START) HERE 0 ,    ; IMMEDIATE
: ?DIVE  POSTPONE (?DIVE) DUP CELL+ , ; IMMEDIATE
: EMERGE POSTPONE EXIT HERE SWAP !    ; IMMEDIATE

\ Используем суперцикл для вычисления факториала
: FACTORIAL ( u1 -- u2 )
  DUP 0= - DUP 1-
  IF
    START DUP 1- DUP 1- ?DIVE * EMERGE
  THEN
;

8 FACTORIAL U.
BYE
Внутри конструкции может быть сколько угодно ?DIVE , например :
... START ... ?DIVE ... ?DIVE ... ?DIVE ... EMERGE ...


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB