Форум программистов, компьютерный форум, киберфорум
Assembler: математика, вычисления
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/43: Рейтинг темы: голосов - 43, средняя оценка - 4.77
0 / 0 / 1
Регистрация: 23.08.2010
Сообщений: 66
1

Вычислить факториал для числа в формате двойного слова

29.03.2011, 16:45. Показов 8051. Ответов 37
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток!
Задание:
Вычислить N! для числа в формате двойного слова.
смущает формат- двойное слово
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.03.2011, 16:45
Ответы с готовыми решениями:

Факториал числа с выводом в римском формате
Привет форумчане! Необходимо написать программу, текст задания: Написать программу, которая...

Вычислить заданное целочисленное выражение для данных в формате INTEGER переменные a, b, а X в формате LONGINT
1. Написать на языке ассемблера процедуру, вычисляющее заданное значение по входным переменным;...

Используя цикл "ДЛЯ" (for) вычислить факториал указаного числа.
Используя цикл "ДЛЯ" (for) вычислить факториал указаного числа.

Вычислить факториал числа n
Вычислить факториал числа n С помощью рекурсии

37
0 / 0 / 1
Регистрация: 23.08.2010
Сообщений: 66
29.03.2011, 23:20  [ТС] 21
Author24 — интернет-сервис помощи студентам
это я понял...
я сейчас думаю- как записать результат вычислений из регистров DX: AX в переменную и вывеси на экран...
как это сделать?
0
4165 / 1817 / 216
Регистрация: 06.10.2010
Сообщений: 4,074
30.03.2011, 15:37 22
Например так (линковать с ключом /t)
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
.model tiny
.code
.486
org 100h
.startup
mov ax,0789h
mov dx,0FAd7h
 
mov di,offset _str
 
mov cx,4
hi:xor  si,si
   shld si,dx,4
   shl  dx,4
   add  si,offset hextable 
   movsb
loop hi
 
mov cx,4
lo:xor  si,si
   shld si,ax,4
   shl  ax,4
   add  si,offset hextable 
   movsb
loop lo
 
mov dx,offset _str
mov ah,9
int 21h
 
xor ax,ax
int 16h
ret
 
hextable db '0123456789ABCDEF'
_str     db 9 dup('$')
end
Добавлено через 3 минуты
Факториал ты сможешь расчитать до 9. Дальше уже нужно 32-битное умножение.
0
639 / 482 / 12
Регистрация: 10.01.2011
Сообщений: 1,045
30.03.2011, 16:26 23
Здесь вычисляется 40! и выводится в 16-ричном виде. В принципе, 40! - не предел.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
.model tiny
.code
.286
org 100h
start:
 
std
mov x,len
sub x,2
lea di,buf
add di,x
mov si,di
mov word ptr [di],1
mov bx,1
lodsw
@1:
mul bx
stosw
@8:
mov cx,dx
mov ax,[si]
mul bx
cmp ax,0
jnz @f
mov [si],ax
add [si],cx
inc bx
dec y
jz @4
lea si,buf
add si,x
@9:
lodsw
cmp ax,0
je @9
mov di,si
add di,2
jmp @1
 
@@:
stosw
add [si],cx
jnc @2
adc dx,0
@2:
sub si,2
jmp @8
 
@4:
cld
lea bx,xtable
lea si,buf
lea di,buf1
mov dx,len+2
mov x,dx
@6:
sub x,2
lodsw
cmp ax,0
jz @6
add x,2
sub si,2
mov cx,16
lodsw
sub x,2
@@:
test ax,0f000h
jnz @5
sub cx,4
rol ax,4
jmp @b
 
@7:
lodsw
sub x,2
jz exit
mov cx,16
@5:
rol ax,4
push ax
and ax,0fh
xlatb
stosb
pop ax
and ax,0fff0h
sub cx,4
jnz @5
jmp @7
 
exit:
lea dx,buf1
mov ah,9
int 21h
xor ax,ax
int 16h
 
ret
buf1 db 200 dup ('$')
buf db 80 dup (?)
len equ $-buf
x dw ?
y db 40
xtable db '0123456789ABCDEF'
end start
1
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
31.03.2011, 04:43 24
А это Сакену для коллекции -- вычисляю факториал n (n <=73) и вывожу его в нормальном десятичном виде
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
.586p
.model flat
.code
include windows.inc
includelib user32.lib
extrn _imp__MessageBoxA@16:dword
n equ 73
;19!=121645100408832000
;20!=2432902008176640000
;21!=51090942171709440000
;22!=1124000727777607680000
;23!=25852016738884976640000
;24!=620448401733239439360000 
;25!=15511210043330985984000000
;26!=403291461126605635584000000
;27!=10888869450418352160768000000
;28!=304888344611713860501504000000
;29!=8841761993739701954543616000000
;30!=2,6525285981219105863630848e+32
;31!=8,22283865417792281772556288e+33
;32!=2,6313083693369353016721801216e+35
;33!=8,68331761881188649551819440128e+36
;34!=2,9523279903960414084761860964352e+38
;35!=1,0333147966386144929666651337523e+40
;36!=3,7199332678990121746799944815084e+41
;37!=1,3763753091226345046315979581581e+43
;38!=5,2302261746660111176000722410007e+44
;39!=2,0397882081197443358640281739903e+46
;40!=8,1591528324789773434561126959612e+47
;41!=3,3452526613163807108170062053441e+49
;42!=1,4050061177528798985431426062445e+51
;43!=6,0415263063373835637355132068514e+52
;44!=2,6582715747884487680436258110146e+54
;45!=1,1962222086548019456196316149566e+56
;46!=5,5026221598120889498503054288003e+57
;47!=2,5862324151116818064296435515361e+59
;48!=1,2413915592536072670862289047373e+61
;49!=6,082818640342675608722521633213e+62
;50!=3,0414093201713378043612608166065e+64
;51!=1,5511187532873822802242430164693e+66
;52!=8,0658175170943878571660636856404e+67
;53!=4,2748832840600255642980137533894e+69
;54!=2,3084369733924138047209274268303e+71
;55!=1,2696403353658275925965100847567e+73
;56!=7,1099858780486345185404564746372e+74
;57!=4,0526919504877216755680601905432e+76
;58!=2,3505613312828785718294749105151e+78
;59!=1,3868311854568983573793901972039e+80
;60!=8,3209871127413901442763411832234e+81
;61!=5,0758021387722479880085681217663e+83
;62!=3,1469973260387937525653122354951e+85
;63!=1,9826083154044400641161467083619e+87
;64!=1,2688693218588416410343338933516e+89
;65!=8,2476505920824706667231703067855e+90
;66!=5,4434493907744306400372924024784e+92
;67!=3,6471110918188685288249859096605e+94
;68!=2,4800355424368305996009904185692e+96
;69!=1,7112245242814131137246833888127e+98
;70!=1,1978571669969891796072783721689e+100
;71!=8,5047858856786231752116764423993e+101
;72!=6,1234458376886086861524070385275e+103
;73!=4,4701154615126843408912571381251e+105
start:  mov edi,offset result+len;edi - указатель на последний байт результата
    mov esi,n
    mov dword ptr [edi-4],esi
    sub edi,8
    mov ebp,1
    dec esi
@1: mov ecx,ebp
    xor ebx,ebx
@@: mov eax,dword ptr [edi+4*ecx]
    mul esi
    add eax,ebx
    adc edx,0
    mov ebx,edx
    mov dword ptr [edi+4*ecx],eax
    loop @b;.untilcxz
    je @2;  .if !ZERO?
    mov dword ptr [edi],edx
    cmp dword ptr [edi+4*ebp],0
    je @f
    inc ebp
@@: sub edi,4
@2: dec esi
    jne @1;.until ZERO?
; big-endian --> litle-endian
    mov edi,offset result
    mov cl,len/4;длина результата в двордах
@@: mov eax,[edi]
    bswap eax
    stosd
    loop @b
; перевожу hex->dec
    mov esi,offset terminator-1;
@3: mov cl,len;длина в байтах значения делимого
    mov edi,offset result
    xor eax,eax
@@: mov al,[edi];делимое
    div ten
    stosb
    loop @b
    or [esi],ah;остаток
    dec esi
    cmp dword ptr [edi-4],0;cmp result+36,0
    jne @3
    cmp dword ptr [edi-8],0;cmp result+32,0
    jne @3
    cmp dword ptr [edi-12],0;cmp result+32,0
    jne @3
; вывожу на экран
    inc esi
    push MB_OK + MB_ICONASTERISK
    push offset mesbox_title   
    push esi;offset mesbox_text с поправкой на ведущие нули
    push 0
    call _imp__MessageBoxA@16
    ret;выходим из программы
result  db 44 dup (0)
len = $-result
ten db 10
mesbox_text db 112 dup ('0')
terminator db 0
mesbox_title db 'Факториал',0
end start
1
4165 / 1817 / 216
Регистрация: 06.10.2010
Сообщений: 4,074
31.03.2011, 17:25 25
А вот мой дибильный способ
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
.model tiny
.286
.code
org 100h
.startup
mov si,offset result1+len-2
mov di,offset result2+len-2
mov dx,1
std
calc:mov  bx,dx
     mov  cx,len-2
     _mul:pusha
          _add:lodsb
               add al,[di]
               aaa
               stosb
               adc byte ptr [di],0
          loop _add
          popa
          dec  bx
     jnz _mul
     inc  dx
     xchg si,di
     inc  cx
     pusha
     rep  movsb
     popa 
     cmp  dx,n
jnz calc
 
lea  dx,[si-len+2]
bcdtoasc:add byte ptr [si],'0'
         dec si
loop bcdtoasc
         
mov  ah,9
int  21h
 
xor  ax,ax
int  16h
ret
 
n=29
result1 db 30 dup(0),1,'$'
result2 db 30 dup(0),1,'$'
len = $-result2
end
1
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
31.03.2011, 17:49 26
Vadimych,
Цитата Сообщение от Vadimych Посмотреть сообщение
Здесь вычисляется 40! и выводится в 16-ричном виде. В принципе, 40! - не предел.
log_2^(40!) = 160, а у вас 40*8 = 320, т.е. 67! это придел (:
0
639 / 482 / 12
Регистрация: 10.01.2011
Сообщений: 1,045
31.03.2011, 18:50 27
outoftime, во вложении программа, выводящая на консоль 255!. Если есть желание, проверьте правильность результата на логарифмической линейке.
Вложения
Тип файла: rar 1.rar (304 байт, 100 просмотров)
1
232 / 102 / 6
Регистрация: 18.04.2010
Сообщений: 294
01.04.2011, 00:32 28
Vadimych, интересно, сколько hex-цифр будет занимать факториал числа, выводящегося в Вашей программе)
0
639 / 482 / 12
Регистрация: 10.01.2011
Сообщений: 1,045
01.04.2011, 04:30 29
6a6ka, см. 1.rar.
0
232 / 102 / 6
Регистрация: 18.04.2010
Сообщений: 294
01.04.2011, 08:45 30
Я имел в виду (255!)!
0
639 / 482 / 12
Регистрация: 10.01.2011
Сообщений: 1,045
01.04.2011, 09:00 31
А, вот Вы об чём. Не знаю, наверное, видеопамяти не хватит для записи.
0
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
02.04.2011, 10:56 32
Vadimych, Дам, на винде не идут комовские программы, пришлось юзать емулятор, можете в будущем давать просто ихсодные коды? Или лучше exe файлы?

Добавлено через 1 минуту
Цитата Сообщение от Vadimych Посмотреть сообщение
видеопамяти не хватит для записи
Ты используешь видео памать для хранения факториалла?
0
116 / 136 / 0
Регистрация: 15.04.2012
Сообщений: 1,031
12.05.2012, 12:15 33
Vadimych, может быть и хватит. Ну ка, (255!)! < 2^65536 наверное.
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
12.05.2012, 12:18 34
programmisto,
255!=3,3508506849329791176526651237548e+504
2^65536=2,0035299304068464649790723515603e+19728
а вот (255!)! я даже считать не берусь, просто калькулятор завис, но это больше чем 2^65536
1
116 / 136 / 0
Регистрация: 15.04.2012
Сообщений: 1,031
12.05.2012, 12:40 35
Mikl___, я за тебя досчитаю:

255!=3,3508506849329791176526651237548e+504
2^65536=2,0035299304068464649790723515603e+19728

255!! = 3,3508506849329791176526651237548e+504^2 = 3,3508506849329791176526651237548e+254016

Ну да, побольше. Но ведь можно ещё прихватить другие сегменты. Их ведь 65536 (!). Нужно где-то 10-15 сегментов. Допустимо.
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
12.05.2012, 12:47 36
Цитата Сообщение от programmisto Посмотреть сообщение
Mikl___, я за тебя досчитаю:
255!=3,3508506849329791176526651237548e+504
255!! = 3,3508506849329791176526651237548e+504^2 = 3,3508506849329791176526651237548e+254016
programmisto, а с чего это Х!!=(Х!)^2 ? Проверь на любом небольшом числе:
5!=120
(120)^2=14400
120!=6,6895029134491270575881180540904e+198
0
116 / 136 / 0
Регистрация: 15.04.2012
Сообщений: 1,031
12.05.2012, 12:51 37
Mikl___, я неправильно записал. Вот по другому:
255!! = 3,3508506849329791176526651237548e+(504^2) = 3,3508506849329791176526651237548e+254016

Я возвожу степень 504 в квадрат. То есть показатель степени возводим в квадрат, а не число. Понял? Вычислил примерно. Поидее половину этого числа можно отбросить.
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
12.05.2012, 13:26 38
Цитата Сообщение от programmisto Посмотреть сообщение
Mikl___, я неправильно записал. Вот по другому:
255!! = 3,3508506849329791176526651237548e+(504^2) = 3,3508506849329791176526651237548e+254016
Я возвожу степень 504 в квадрат. То есть показатель степени возводим в квадрат, а не число. Понял? Вычислил примерно. Поидее половину этого числа можно отбросить.
programmisto, мне интересно, ты вообще учил математику? Хотя бы в школе?
0
12.05.2012, 13:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.05.2012, 13:26
Помогаю со студенческими работами здесь

Вычислить факториал числа
Вычислить факториал числа. Заранее спасибо

Вычислить факториал числа n
Вычислить факториал числа n. n! = 1*2*…*n-1*n; Используя только циклы

Вычислить факториал числа N.
Составить программу, которая будет находить факториал числа! N = 1 * 2 * 3 * ... * n.

вычислить факториал числа на c#
Здравствуйте, подскажите пожалуйста как сделать чтобы считало факториал любого числа (неправильно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru