100 факториал

Ответить

Код подтверждения
Введите код в точности так, как вы его видите. Регистр символов не имеет значения.

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[url] ВКЛЮЧЁН
Смайлики ОТКЛЮЧЕНЫ

Обзор темы
   

Развернуть Обзор темы: 100 факториал

Re: 100 факториал

Voortex » 29 дек 2008, 07:35

Все, ребята, откат...Я показал преподавателю работу, какая есть, и он мне засчитал ее на отлично, оказывается достаточно было просто чтоб смогла вычислить 1000, а я уж переволновался, что полностью оформить надо....
вот ниже код для будущих студентов, если кому-то когда-нибудь понадобиться вычислить факториал 1000!

model tiny
.386
masm
.code
assume cs:@code, ds:@code, ss:@code
org 100h

begin:

jmp @start
Num1 db 2599 dup (0), 1
Num2 db 2600 dup (0)
NFact dw 1000 ; // 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, 2599
add di, cx
add si, cx
@add_1:
mov al, [si]
add al, [di]
daa
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, 1300
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, 2600

@toascii:
add byte ptr [si], '0'
inc si
loop @toascii
lea si, Num1 ; // Removes forward zeroes
mov cx, 2600
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, 2600
sub cx, di
mov dx, si
int 21h

mov ax, 4C00h
int 21h

end begin

Re: 100 факториал

Voortex » 28 дек 2008, 15:05

Помогите хотя бы сделать в старом коде, чтобы в файл записался от какого числа выведен факториал, например:
"Факториал 5 = 120"

Re: 100 факториал

Voortex » 28 дек 2008, 10:45

Вот тут исправил:
NFact dw ? ;
Теперь запускается, можно ввести число, но вычисляет с глюками....это потому что кажись надо еще переводить строку в число ?
Кстати, когда он записывает результат, он записывает его в одной строке, т.е. большой хвост, а хотелось бы, чтобы был перенос по строке

Re: 100 факториал

BBB » 25 дек 2008, 15:43

Voortex писал(а):Изменил некоторые данные:
При компиляции выводит ошибку

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

сmp bx, NFact
Operand types do not match 
Несоответствие типов операндов.
Регистр bx - это 16 бит, NFact объявлен как db, т.е. 8 бит.
Оператором cmp можно сравнивать или два 16-битных значения, или два 8-битных значения (регистр-регистр или регистр-память)

Re: 100 факториал

Voortex » 25 дек 2008, 14:40

Изменил некоторые данные:

msg1 db 'Vvedite chislo $' ;Добавил параметр вывода стоки
Num1 db 2599 dup (0), 1 ;Больше разрядов для вычисления 1000
Num2 db 2600 dup (0)
buf db 8,8 dup (0) ;для помещения введенной строки
NFact db ? ;
fName db 'Result.txt',0
hFile dw 0

И добавил:

;//================= Main code
@start:
mov AH, 09h
lea DX, msg1 ;для вывода строки
int 21h
mov ah,0Ah ; для ввода числа, к которому присвоится Nfact
mov dx, offset Nfact
int 21h

push cs
pop ds
push ds
pop es

При компиляции выводит ошибку

сmp bx, NFact
Operand types do not match

Может я не там поставил ввод числа или еще что забыл ?

Re: 100 факториал

Voortex » 19 дек 2008, 08:27

system architect
У меня 2600 цифр получилось, я для проверки поставил 2700, ответ факториала 1000 остался таким же, потом 3000 поставил, тоже не изменился. Сейчас поставил как ты задал 2890, тоже также, т.е. можно считать, что 2600 знаков нормально))...Осталось маленький штрих, чтобы вводить...Я вроде нашел команду...пока не разобрался,там AH=0ah - ввод строки в буфер, а преобразование в число - cwd

Количество цифр в числе 1000!

BBB » 18 дек 2008, 10:29

somewhere писал(а):Повторю еще раз, что не мне, не вам - не известно количество десятичных знаков в числе 1000! Еще точно известно что их больше 1000.
Попробуйте для начала тысяч 5 поставьте.
Несложно сделать оценку сверху количества цифр в числе 1000!
Другое дело, что Voortex пишет, что число будет вводиться с клавиатуры, так что оно может оказаться и больше 1000. Хотя, нижеприведенные рассужедния можно формализовать для произвольного натурального N. А массив символов, насколько я помню возможности ассемблера, можно выделять динамически.

Итак, оценка основана на том факте, что количество цифр в числе N (рассматриваем запись числа в десятичной системе счисления) равно 1 + [lg (N)]:

QG (N) = 1 + [lg (N)]
где QG (N) я обозначил "кол-во цифр в числе N", а [x] - целая часть числа x.

Будем использовать следующие очевидные равенства и неравенства:
lg (1) = 0
для 2 <= n < 10: lg (n) < 1
lg (10) = 1
для 11 <= n < 100: lg (n) < 2
lg (100) = 2
для 101 <= n < 1000: lg (n) < 3
lg (100) = 3

Проводим оценку:
lg (1000!) = lg (1 * 2 * ... * 1000) = lg(1) + lg(2) + .... + lg (1000) =
lg (1) + (lg (2) + ... + lg (9)) +
lg (10) + (lg (11) + ... + lg (99)) +
lg (100) + (lg (101) + ... + lg (999)) +
lg (1000) <
0 + 8 * 1 +
1 + 89 * 2 +
2 + 899 * 3 +
3 = 9 + 180 + 2700 = 2889

Таким образом:
QN (1000!) = 1 + [lg (N)] < 1 + [2889] = 2890

Т.е. в числе 1000! заведомо не более 2890 цифр.

Re: 100 факториал

somewhere » 09 дек 2008, 20:26

Повторю еще раз, что не мне, не вам - не известно количество десятичных знаков в числе 1000! Еще точно известно что их больше 1000. Попробуйте для начала тысяч 5 поставьте. Это замедлит расчет, зато потом когда найдете, можно определить границы поточнее. Для одноразового расчета можно и подождать несколько лишних секунд.
Еще можно извратиться и сделать проверку на переполнение сего массива цифр и динамически его расширять - только вот это весомо увеличит размер кода и добавит лишнего гемороя.

Re: 100 факториал

Voortex » 09 дек 2008, 20:16

Спасибо!
Попробую сделать, хотя в ассемблере плохо шарю...
А так я правильно для цифр в числе в том месте где надо, 1000 поставил ?
---
Можно хотя бы вообще узнать, какой код для того чтобы вводить текст ?
И еще хотя бы код чтобы уже был размещенным текст, типа "Введите число". А я сам у себя попробую разобраться
Я думаю введеное число преобразовав в число сразу можно присвоить Nfact

Re: 100 факториал

somewhere » 09 дек 2008, 14:50

1) Num2 - это массив из десятичных цифр факториала, мне лично не известно количество цифр в числе 1000! но без сомнений их больше 1000.
2) Для ввода с клавиатуры строки используйте функцию MS-DOS, для преобразования введеной строки в число - поищите в разделе "Ассемблер", в некоторых темах алгоритм имеется.
3) Ввод имени файла - также через функцию MS-DOS в массив fName
4) ВНИМАТЕЛЬНО следите за размерами массивов при считывании с клавиатуры, дабы не перекрыть другой участок памяти.

Вернуться к началу