100 факториал
Модератор: Andy
Так как будем писать в текстовый файл, то простейший способ реализации - байтовые массивы, где каждый байт есть цифра. На таком множестве для N! достаточно реализовать только операцию сложения (проще, если скорость не критична) или умножения (сложнее, но быстрее). Этот метод расчета факториала будет зависеть только от размера свободной памяти и времени. В теории можно подсчитать сколь угодно большой факториал - например 1000000!
It's a long way to the top if you wanna rock'n'roll
Код: Выделить всё
.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
Не компилит - очень размытое понятие, конкретно что, в какой строке, какая версия TASM(MASM), с какими параметрами и т.д.
Этот код компилился, линковался, запускался и работал на:
- TASM 4.0
- параметры
tasm %1.asm /la
tlink %1.obj
результат 100! в файле Result.txt
4207792900060052850151082180250619118641131666208730663151040180005505559973158901799305787908399921209031822450000000000000000000000000000000000000000000000
Этот код компилился, линковался, запускался и работал на:
- 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
-
- Сообщения: 18
- Зарегистрирован: 15 окт 2007, 01:44
сматри
скачал TASM 4.0 файл обозвал fakt.asm пишу:
...\tasm40\tasm fakt.asm /la
и вот что выкидывает
...такой же разультат и на TASM 4.1 ...ща попробую на 5-ом

...\tasm40\tasm fakt.asm /la
и вот что выкидывает

- Вложения
-
- untitled.JPG (40.09 КБ) 287 просмотров
-
- Сообщения: 375
- Зарегистрирован: 31 авг 2007, 03:06
sasadabest
неверно задан комментарий!
замени все символы " //" на " ;"
(кавычки в поиске/замене набирать НЕ НАДО!!!)
неверно задан комментарий!
замени все символы " //" на " ;"
(кавычки в поиске/замене набирать НЕ НАДО!!!)
<<ВАЖНО>>
В проге есть тупая ошибка, из-за которой факториал считается неверно. Необходимо дополнить на следующий
Кто знает, что такое daa, тот поймет почему.
В проге есть тупая ошибка, из-за которой факториал считается неверно. Необходимо дополнить
Код: Выделить всё
add al, [di]
add al, ah
daa
Код: Выделить всё
add al, [di]
daa
add al, ah
daa
It's a long way to the top if you wanna rock'n'roll