Re: 100 факториал
Добавлено: 17 окт 2007, 16:01
ок,поменял... проста когда вычисляешь факториал больших чисел ошибки незаметно.. всё равно сенкс 

Код: Выделить всё
.model tiny
.code
.386
jmp @start
Num1 db 199 dup (0), 1 ; Каждое число из 200 цифр, в этом храним 1
Num2 db 200 dup (0) ; а этом 0
NFact dw 100 ; Задаем, какой нужен N!
fName db 'Result.txt' ; куда результат выводить
hFile dw 0 ; это хендл файла, задавать не надо, рассчитывается внутри проги
;//========================= Сложение
;// Input:
;// SI - Первое число
;// DI - Второе число
;//
;// Output:
;// SI - Результат сложения
Addition proc near
pusha
mov cx, 199
add di, cx
add si, cx ; начинаем с конца
xor ah, ah
@add_1:
mov al, [si] ; берем цифру из 1
add al, [di] ; складываем с цифрой 2-го
daa ; корректируем в BCD
add al, ah ; добавляем предыдущий разряд
daa ; корректируем
mov ah, al
shr ah, 4 ; старший разряд в старших 4 битах сохраняем в AH
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 ; es = ds = cs
mov ah, 3Ch ; Создаем файл
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 ; кол-во необходимых сложений - 1
dec cx
@fact1:
call Addition ; складываем
loop @fact1
inc bx ; переход к следущему множителю
cmp bx, NFact ; пока не достигли нужного
jle @fact
lea si, Num1 ; подсчитали факториал, теперь переводим в ASCII код
mov cx, 200
@toascii:
add byte ptr [si], '0' ; для этого добавим к каждой цифре код '0' или 30h
inc si
loop @toascii
lea si, Num1 ; но у нас остались нули в начале
mov cx, 200
xor di, di ; и их сейчас будем убирать
@k1:
cmp byte ptr [si], '0' ; если не встретили 0, то выход из цикла
jnz @k2
inc di
inc si
loop @k1
@k2:
mov ah, 40 ; теперь в DI - кол-во пропущенных нулей
mov bx, hFile ; а в SI - позиция в числе, с которой надо писать в файл
mov cx, 200
sub cx, di ; кол-во байт для записи = 200 - DI
mov dx, si
int 21h
mov ax, 4C00h ; выходим
int 21h
end