100 факториал

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

sasadabest
Сообщения: 18
Зарегистрирован: 15 окт 2007, 01:44

15 окт 2007, 01:59

666666666666
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

15 окт 2007, 13:36

Так как будем писать в текстовый файл, то простейший способ реализации - байтовые массивы, где каждый байт есть цифра. На таком множестве для N! достаточно реализовать только операцию сложения (проще, если скорость не критична) или умножения (сложнее, но быстрее). Этот метод расчета факториала будет зависеть только от размера свободной памяти и времени. В теории можно подсчитать сколь угодно большой факториал - например 1000000!
It's a long way to the top if you wanna rock'n'roll
sasadabest
Сообщения: 18
Зарегистрирован: 15 окт 2007, 01:44

15 окт 2007, 14:59

666666666666
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

15 окт 2007, 16:22

Код: Выделить всё

.model tiny
.code
.386

jmp @start

Num1  db 199 dup (0), 1
Num2  db 200 dup (0)
NFact dw 100				// N! you want to calc
fName db 'Result.txt',0		// Output file
hFile dw 0				// File handle

;//========================= Addition
;// Input:
;// SI - First number
;// DI - Second number
;//
;// Output:
;// SI - Result

Addition proc near
pusha
mov cx, 199
add di, cx
add si, cx
	@add_1:
mov al, [si]
add al, [di]
add al, ah
daa
mov ah, al
shr ah, 4
and al,0Fh
mov [si], al
dec si
dec di
dec cx
jnz @add_1

popa
ret
Addition endp

;//================= Main code
	@start:
push cs
pop ds
push ds
pop es
mov ah, 3Ch		// Create file
xor cx, cx
lea dx, Fname
int 21h
mov hFile, ax

mov bx, 2
	@fact:
lea si, Num1
lea di, Num2
cld
mov cx, 100
rep movsw			// Num2 = Num1
lea si, Num1
lea di, Num2
mov cx, bx
dec cx
	@fact1:		// (Num1 = Num1 + Num2) * BX 
call Addition
loop @fact1
inc bx
cmp bx, NFact
jle @fact

lea si, Num1		// Convert Num1 to ASCII
mov cx, 200
	@toascii:
add byte ptr [si], '0'
inc si
loop @toascii

lea si, Num1		// Removes forward zeroes
mov cx, 200
xor di, di
	@k1:
cmp byte ptr [si], '0'
jnz @k2
inc di
inc si
loop @k1
	@k2:
mov ah, 40h		// Write to file
mov bx, hFile
mov cx, 200
sub cx, di
mov dx, si
int 21h

mov ax, 4C00h
int 21h
end
It's a long way to the top if you wanna rock'n'roll
sasadabest
Сообщения: 18
Зарегистрирован: 15 окт 2007, 01:44

15 окт 2007, 20:50

666666666666
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

16 окт 2007, 08:54

Не компилит - очень размытое понятие, конкретно что, в какой строке, какая версия TASM(MASM), с какими параметрами и т.д.
Этот код компилился, линковался, запускался и работал на:

- TASM 4.0
- параметры
tasm %1.asm /la
tlink %1.obj

результат 100! в файле Result.txt
4207792900060052850151082180250619118641131666208730663151040180005505559973158901799305787908399921209031822450000000000000000000000000000000000000000000000
It's a long way to the top if you wanna rock'n'roll
sasadabest
Сообщения: 18
Зарегистрирован: 15 окт 2007, 01:44

16 окт 2007, 13:05

сматри :) скачал TASM 4.0 файл обозвал fakt.asm пишу:
...\tasm40\tasm fakt.asm /la

и вот что выкидывает :confused: ...такой же разультат и на TASM 4.1 ...ща попробую на 5-ом
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Serge_Bliznykov
Сообщения: 366
Зарегистрирован: 31 авг 2007, 03:06

16 окт 2007, 22:17

sasadabest
неверно задан комментарий!
замени все символы " //" на " ;"
(кавычки в поиске/замене набирать НЕ НАДО!!!)
sasadabest
Сообщения: 18
Зарегистрирован: 15 окт 2007, 01:44

17 окт 2007, 02:22

666666666666
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

17 окт 2007, 13:17

<<ВАЖНО>>
В проге есть тупая ошибка, из-за которой факториал считается неверно. Необходимо дополнить

Код: Выделить всё

add al, [di]
add al, ah
daa
на следующий

Код: Выделить всё

add al, [di]
daa
add al, ah
daa
Кто знает, что такое daa, тот поймет почему.
It's a long way to the top if you wanna rock'n'roll
Ответить