Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
lalalalalalala
0 / 0 / 0
Регистрация: 19.05.2013
Сообщений: 15
1

Факториал (вычисление вплоть до 1000!)

19.05.2013, 09:51. Просмотров 1496. Ответов 15
Метки нет (Все метки)

прошу,помогите) нужно написать программу на ассемблере, вычисляющую факториал задаваемого с клавиатуры числа. ДОЛЖНА БЫТЬ РАБОТОСПОСОБНА ДО 1000! . делается умножением "в столбик". создается массив из 2567 цифр(примерно столько цифр в 1000!) и умножается. всё несложно, на паскале написала, а в ассемблере полный ноль(
вот,если что,паскаль

Pascal
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
program Project2;
uses
  SysUtils;
 
var
l, i, n, x, y, m: integer; {n - вводимое число, x - перенос, y - для промежуточного вычисления}
k: array[1..2567] of integer;
 
begin
Writeln('input number');
Readln(n);
 
k[2567]:=1;   
for i:=1 to 2566 do    {всё заполняем нулями, кроме последней цифры}
k[i]:=0;
 
for l:=1 to n do begin
 
  x:=0;                   
 
  for i:=2567 downto 1 do
  begin
 
  y:=k[i]*l+x;          {умножаем последнюю цифру на число (от 1 до n)}
  k[i]:=y mod 10;     {в самый младший разряд записываем остаток}
  x:=y div 10;         {а это "в уме", т.е. перенос в следующий разряд}
 
  end;
 
end;
 
 
 for i:=1 to 2567 do   {выводим число по 20 цифр в строке. в ассемблере это не обязательно}
 if i mod 20 <> 0 then
 write(k[i])
 else writeln;
 readln;
 
end.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.05.2013, 09:51
Ответы с готовыми решениями:

Факториал (вычисление вплоть до 1000!)
Здравствуйте, большие проблемы с асм. Очень прошу вашей помощи.. Составить ...

Факториал некторого числа записан в eax, а нужно вывести этот факториал в ebx
Хочу сделать код факториал некторого числа записан в eax, а нужно вывести этот...

Факториал 1000
Здравствуйте, помогите пожалуйста! Мне нужно сделать в Borland C прогу для...

Факториал до 1000
Составить программу, выводящую на экран и в задаваемый с клавиатуры файл...

Нужно вычислить факториал 33, 100 и 1000 как можно проще
Нужно вычислить фактариал 33, 100 и 1000 как можно проще

15
Mikl___
Автор FAQ
11800 / 6102 / 557
Регистрация: 11.11.2010
Сообщений: 11,096
19.05.2013, 10:32 2
lalalalalalala,
берем Windows-калькулятор 1000!=4,02387260077093773543702433923e+2567 получается грубо 2567 нулей + четверка, то есть 2568 цифр. Вот здесь я вычисляю всего лишь факториал 78, то есть четверка и 105 нулей, то есть в двадцать раз меньше чисел, но посмотри какой это геморрой... И мне почемуто кажется что программа приведенная выше для вычисления факториала тысячи не рабочая, разубеди меня и прикрепи ЕХЕ-файл который вычисляет 1000! и выводит цифру на экран, хотя бы в виде 4,02387260077093773543702433923e+2567 потому что 2568 это полтора экрана цифр в 25 рядов по 80 цифр в ряду
0
lalalalalalala
0 / 0 / 0
Регистрация: 19.05.2013
Сообщений: 15
19.05.2013, 11:04  [ТС] 3
она рабочая, можешь проверить (ну,если с количеством цифр я ошиблась, можно и 2568 сделать, работоспособность от этого не изменилась). я понимаю, что геморрой, но не приду ж я к преподу и не скажу "ой,знаете, это такой геморрой, я не буду делать", курсач то надо сдавать. вот я и прошу помощи у людей, которые это умеют. и не обязательно бесплатной помощи
0
Vadimych
635 / 478 / 12
Регистрация: 10.01.2011
Сообщений: 1,047
19.05.2013, 11:20 4
40238726007709377354370243392300398571937486421071463254379991042993851239862902
05920442084869694048004799886101971960586316668729948085589013238296699445909974
24504087073759918823627727188732519779505950995276120874975462497043601418278094
64649629105639388743788648733711918104582578364784997701247663288983595573543251
31853239584630755574091142624174743493475534286465766116677973966688202912073791
43853719588249808126867838374559731746136085379534524221586593201928090878297308
43139284440328123155861103697680135730421616874760967587134831202547858932076716
91324484262361314125087802080002616831510273418279777047846358681701643650241536
91398281264810213092761244896359928705114964975419909342221566832572080821333186
11681155361583654698404670897560290095053761647584772842188967964624494516076535
34081989013854424879849599533191017233555566021394503997362807501378376153071277
61926849034352625200015888535147331611702103968175921510907788019393178114194545
25722386554146106289218796022383897147608850627686296714667469756291123408243920
81601537808898939645182632436716167621791689097799119037540312746222899880051954
44414282012187361745992642956581746628302955570299024324153181617210465832036786
90611726015878352075151628422554026517048330422614397428693306169089796848259012
54583271682264580665267699586526822728070757813918581788896522081643483448259932
66043367660176999612831860788386150279465955131156552036093988180612138558600301
43569452722420634463179746059468257310379008402443243846565724501440282188525247
09351906209290231364932734975655139587205596542287497740114133469627154228458623
77387538230483865688976461927383814900140767310446640259899490222221765904339901
88601856652648506179970235619389701786004081188972991831102117122984590164192106
88843871218556461249607987229085192968193723886426148396573822911231250241866493
53143970137428531926649875337218940694281434118520158014123344828015051399694290
15348307764456909907315243327828826986460278986432113908350621709500259738986355
42771967428222487575867657523442202075736305694988250879689281627538488633969099
59826280956121450994871701244516461260379029309120889086942028510640182154399457
15680594187274899809425474217358240106367740459574178516082923013535808184009699
63725242305608559037006242712434169090041536901059339838357779394109700277534720
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000
1
Troll_Face
19.05.2013, 11:43
  #5

Не по теме:

а как узнать на сколько нулей оканчивается факторила какого-либо числа? к примеру факториал 20. я так думаю: нужно выписать произведение чисел, на конце которых есть нули. затем посчитать кол-во этих нулей. но мой метод не сработал... Как же тогда решить сию задачу?

0
Mikl___
Автор FAQ
11800 / 6102 / 557
Регистрация: 11.11.2010
Сообщений: 11,096
20.05.2013, 09:18 6
Troll_Face, посчитать сколько раз произошло умножение на число кратное 5, при умножении 5 на четное число обязательно появится число с нулем, а четных чисел ровно половина. 20! имеет в конце 4 нуля (5, 10, 15, 20)
20!=2432902008176640000
29!=8841761993739701954543616000000 29/5=5 (5, 10, 15, 20, 25) но 25=52 поэтому нулей уже 6
30!=265252859812191058636308480000000 30/5=6 + 1 из-за 25=52
lalalalalalala,
не работает твой паскалевский вариант
n!выводитдолжно быть
1!149171
2!298342
3!895026
4!35800824
5!1790040120
6!10740240720
7!751816805040
8!145344040320
9!513080960362880
10!54308096003628800
значения с правильными даже близко не лежат...
1
Vadimych
635 / 478 / 12
Регистрация: 10.01.2011
Сообщений: 1,047
20.05.2013, 15:23 7
Цитата Сообщение от Mikl___ Посмотреть сообщение
не работает твой паскалевский вариант
Пардон. Работает. Только ведущие нули не убирает. Массив до 3000 байт увеличил. 3.rar просто переименовать в 3.exe.
0
Вложения
Тип файла: rar 3.rar (2.8 Кб, 11 просмотров)
Vadimych
635 / 478 / 12
Регистрация: 10.01.2011
Сообщений: 1,047
20.05.2013, 15:29 8
Поторопился, блин. Чётное количество байт в массиве на идёт. Надо нечётное почему-то. Г. всё-таки этот паскаль.
0
Mikl___
Автор FAQ
11800 / 6102 / 557
Регистрация: 11.11.2010
Сообщений: 11,096
20.05.2013, 15:40 9
Vadimych,
там
  • x, y, m: integer для таких больших чисел x и y явно не пригодны, максимум правильно можно посчитать 7! а для 8! будет число больше 32000, другой тип нужен для этих переменных
  • я проверил на факториалах 1 и 2 уже дало ошибки
  • возможно не хватает инициализации переменных
0
Vadimych
635 / 478 / 12
Регистрация: 10.01.2011
Сообщений: 1,047
20.05.2013, 15:46 10
Mikl___, не знаю, что там пригодно, или нет, но вот результат:
input number
1000
0000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000004023872600770937735437024339230039857193748642
0714632543799910429938512398629020592044208486969404800479988610197196058631666
7299480855890132382966994459099742450408707375991882362772718873251977950595099
2761208749754624970436014182780946464962910563938874378864873371191810458257836
7849977012476632889835955735432513185323958463075557409114262417474349347553428
4657661166779739666882029120737914385371958824980812686783837455973174613608537
5345242215865932019280908782973084313928444032812315586110369768013573042161687
7609675871348312025478589320767169132448426236131412508780208000261683151027341
2797770478463586817016436502415369139828126481021309276124489635992870511496497
4199093422215668325720808213331861168115536158365469840467089756029009505376164
5847728421889679646244945160765353408198901385442487984959953319101723355556602
3945039973628075013783761530712776192684903435262520001588853514733161170210396
1759215109077880193931781141945452572238655414610628921879602238389714760885062
6862967146674697562911234082439208160153780889893964518263243671616762179168909
7991190375403127462228998800519544441428201218736174599264295658174662830295557
2990243241531816172104658320367869061172601587835207515162842255402651704833042
6143974286933061690897968482590125458327168226458066526769958652682272807075781
9185817888965220816434834482599326604336766017699961283186078838615027946595513
1565520360939881806121385586003014356945272242063446317974605946825731037900840
4432438465657245014402821885252470935190620929023136493273497565513958720559654
2874977401141334696271542284586237738753823048386568897646192738381490014076731
4466402598994902222217659043399018860185665264850617997023561938970178600408118
9729918311021171229845901641921068884387121855646124960798722908519296819372388
4261483965738229112312502418664935314397013742853192664987533721894069428143411
5201580141233448280150513996942901534830776445690990731524332782882698646027898
4321139083506217095002597389863554277196742822248757586765752344220207573630569
9882508796892816275384886339690995982628095612145099487170124451646126037902930
1208890869420285106401821543994571568059418727489980942547421735824010636774045
5741785160829230135358081840096996372524230560855903700624271243416909004153690
0593398383577793941097002775347200000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000
0
Mikl___
Автор FAQ
11800 / 6102 / 557
Регистрация: 11.11.2010
Сообщений: 11,096
20.05.2013, 15:51 11
в твоей программе 6!=72 9!=36288 25!=1551121004333098598400000 то есть последнюю цифру программа "съедает" и это дикое количество ведущих нулей, тут перед выводом на экран нужно пробежать по буферу, найти первый ненулевой символ и с него начинать вывод. И я пока не разбирал твою программу, а создал программу в Borland Pascal запустив текст из первого сообщения
0
Vadimych
635 / 478 / 12
Регистрация: 10.01.2011
Сообщений: 1,047
20.05.2013, 19:34 12
Цитата Сообщение от Mikl___ Посмотреть сообщение
ут перед выводом на экран нужно пробежать по буферу, найти первый ненулевой символ и с него начинать вывод
Да. И буфер сделать в 3001 байт.

Добавлено через 6 минут
Вот код. То же самое практически, что и у ТС.
Кликните здесь для просмотра всего текста
Pascal
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
program Project2;
 
var
l, i, n, x, y, m: integer; {n - вводимое число, x - перенос, y - для промежуточного вычисления}
k: array[1..3001] of integer;
 
begin
Writeln('input number');
Readln(n);
 
k[3001]:=1;
for i:=1 to 3000 do {всё заполняем нулями, кроме последней цифры}
k[i]:=0;
 
for l:=1 to n do begin
 
x:=0;
 
for i:=3001 downto 1 do
begin
 
y:=k[i]*l+x; {умножаем последнюю цифру на число (от 1 до n)}
k[i]:=y mod 10; {в самый младший разряд записываем остаток}
x:=y div 10; {а это "в уме", т.е. перенос в следующий разряд}
 
end;
end;
 
 
n:=0;
while k[n]=0 do
n:=n+1;
 
for i:=n to 3001 do {выводим число по 20 цифр в строке. в ассемблере это не обязательно}
{if i mod 20 <> 0 then}
write(k[i]);
{else writeln;}
readln;
 
end.


Без ведущих нулей.
0
Mikl___
Автор FAQ
11800 / 6102 / 557
Регистрация: 11.11.2010
Сообщений: 11,096
22.05.2013, 05:11 13
Vadimych,
нормальная программа, только если можно переделай чтобы выводила в научном формате, без лишних нулей в конце, типа так: 100!=9,3326215443944152681699238856267e+157 но с точностью, как в твоей программе. А кстати не знаешь откуда взят алгоритм? Я в паскалевской ветке поискал, но пока не нашел
0
Vadimych
635 / 478 / 12
Регистрация: 10.01.2011
Сообщений: 1,047
22.05.2013, 05:43 14
Mikl___, насчёт алгоритма не в курсе. Может быть, ТС просветит? Я ведь только ведущие нули из её кода убрал. А с форматом попробую разобраться, если не забуду.
0
Mikl___
Автор FAQ
11800 / 6102 / 557
Регистрация: 11.11.2010
Сообщений: 11,096
22.05.2013, 06:03 15
Цитата Сообщение от Vadimych Посмотреть сообщение
Может быть, ТС просветит?
Ну, это врят ли... Последняя активность на сайте была в тот день, когда она эту тему создала. А алгоритм преподаватель, скорее всего, дал, а откуда он его взял, это студентам не интересно... Пойду в Гугле или на алголисте поищу, достаточно простой и точность любая, и сразу вывод на экран организован
0
Taatshi
Администратор
11713 / 5061 / 257
Регистрация: 05.04.2011
Сообщений: 13,811
Записей в блоге: 2
26.05.2013, 16:05 16
Извините, господа, тема неактуальна - есть кросс во фрилансе.

Закрыто.
0
26.05.2013, 16:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2013, 16:05

Как вычислять факториал таких больших чисел, как 1000
подскажите есть ли возможность написать программу которая считает факториал...

Факториал. Вычисление суммы ряда
Помогите, пожалуйста, запрограммировать формулу

Вычисление суммы бесконечного ряда. Факториал
Сделал почти все задания для экзамена, осталось последнее, не могу(.Очень...


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

Или воспользуйтесь поиском по форуму:
16
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru