LINUX.ORG.RU

Как посчитать факториал для 30?

 ,


0

1

Добрый день в настоящее время пишу скрипт где нужно посчитать факториал для 30, до 20 включительно bash считает а дальше по какой то причине нет, подскажите возможно стоит как то по особому прописывать чтобы считалось число больше 20?

Считай факториал в bc.

Bfgeshka ★★★★★
()

30! не влезает в числовое представление баша. Там вроде 64bit signed.

Deleted
()

Это делается так:

  1. Пишется программа вычисления факториала на любом ЯП.
  2. Вызывается из баш-скрипта
ugoday ★★★★★
()

факториал для 30

Он не влезет, юзай другой ЯП.

r3lgar ★★★★★
()

Bash не предназначен для вычислений, там переполнение случается (слишком большое число). Юзай bc:

echo 'define fac(x) {if (x>1){return x*fac(x-1)};return 1}   fac(30)' | bc

anonymous
()
Python 3.4.3 (default, Nov 28 2017, 16:41:13) 
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> def factorial(n):
...     if n == 0:
...         return 1
...     else:
...         return n * factorial(n-1)
... 
>>> 
>>> 
>>> factorial(10)
3628800
>>> factorial(20)
2432902008176640000
>>> factorial(30)
265252859812191058636308480000000
>>>

Таблица факториалов 30! = 265252859812191058636308480000000

И да, можно ведь и списком, в строковом представлении.

I-Love-Microsoft ★★★★★
()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от anonymous

вот такой скрипт и это "переполнение" как то можно обойти?

#!/bin/bash function factorial() { if (( $1 < 2 )) then echo 1 else echo $(( $1 * $(factorial $(( $1 - 1 ))) )) | bc fi }

Mihal61ch
() автор топика

Реализовать бигинт на баше или взять готовый https://github.com/0e4ef622/bash-bigint (хотя там умножение еще не реализовано, но его можно дописать)

SZT ★★★★★
()
Последнее исправление: SZT (всего исправлений: 1)
Ответ на: комментарий от anonymous

Хорошо, может быть, но 30 жалких вызовов функции стэк не скушают...

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от ugoday

Анонизмус имел ввиду, что ест куча готовых программ подобного рода для баша, но ты же предлагаешь своё писать (а это еще и конпелять надо, если не скрипт). Называется велосипедостроение.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Во-первых, хочу отметить насколько же приятнее в общении человек, разговаривающий нормальным русским языком, а не чортовыми загадками. Во-вторых, изначальный вопрос имеет смысл только если автор хочет научиться решать такие задачи в общем виде. И единственный безкостыльный вариант: использовать баш как клей для программ, написанных на более подходящих языках.

ugoday ★★★★★
()
Ответ на: комментарий от anonymous

and then

see(find - ctrl-F on link https://oeis.org/A000142/): The first 100 factorials: Table of n, n! for n = 0..100

click and see bash source for first 55: https://pastebin.com/ifQ5spPa

#!/usr/bin/env bash
 
case «$1» in
  1) echo «1» ;;
  2) echo «2» ;;
  3) echo «6» ;;
  4) echo «24» ;;
  5) echo «120» ;;
  6) echo «720» ;;
  7) echo «5040» ;;
  8) echo «40320» ;;
  9) echo «362880» ;;
  10) echo «3628800» ;;
  11) echo «39916800» ;;
  12) echo «479001600» ;;
  13) echo «6227020800» ;;
  14) echo «87178291200» ;;
  15) echo «1307674368000» ;;
  16) echo «20922789888000» ;;
  17) echo «355687428096000» ;;
  18) echo «6402373705728000» ;;
  19) echo «121645100408832000» ;;
  20) echo «2432902008176640000» ;;
  21) echo «51090942171709440000» ;;
  22) echo «1124000727777607680000» ;;
  23) echo «25852016738884976640000» ;;
  24) echo «620448401733239439360000» ;;
  25) echo «15511210043330985984000000» ;;
  26) echo «403291461126605635584000000» ;;
  27) echo «10888869450418352160768000000» ;;
  28) echo «304888344611713860501504000000» ;;
  29) echo «8841761993739701954543616000000» ;;
  30) echo «265252859812191058636308480000000» ;;
  31) echo «8222838654177922817725562880000000» ;;
  32) echo «263130836933693530167218012160000000» ;;
  33) echo «8683317618811886495518194401280000000» ;;
  34) echo «295232799039604140847618609643520000000» ;;
  35) echo «10333147966386144929666651337523200000000» ;;
  36) echo «371993326789901217467999448150835200000000» ;;
  37) echo «13763753091226345046315979581580902400000000» ;;
  38) echo «523022617466601111760007224100074291200000000» ;;
  39) echo «20397882081197443358640281739902897356800000000» ;;
  40) echo «815915283247897734345611269596115894272000000000» ;;
  41) echo «33452526613163807108170062053440751665152000000000» ;;
  42) echo «1405006117752879898543142606244511569936384000000000» ;;
  43) echo «60415263063373835637355132068513997507264512000000000» ;;
  44) echo «2658271574788448768043625811014615890319638528000000000» ;;
  45) echo «119622220865480194561963161495657715064383733760000000000» ;;
  46) echo «5502622159812088949850305428800254892961651752960000000000» ;;
  47) echo «258623241511168180642964355153611979969197632389120000000000» ;;
  48) echo «12413915592536072670862289047373375038521486354677760000000000» ;;
  49) echo «608281864034267560872252163321295376887552831379210240000000000» ;;
  50) echo «30414093201713378043612608166064768844377641568960512000000000000» ;;
  51) echo «1551118753287382280224243016469303211063259720016986112000000000000» ;;
  52) echo «80658175170943878571660636856403766975289505440883277824000000000000» ;;
  53) echo «4274883284060025564298013753389399649690343788366813724672000000000000» ;;
  54) echo «230843697339241380472092742683027581083278564571807941132288000000000000» ;;
  55) echo «12696403353658275925965100847566516959580321051449436762275840000000000000» ;;
esac
 
exit 0
anonymous
()
Ответ на: комментарий от anonymous

and now - if u read Kernighans&Pike? Unix is programer's ide u can try write program on bash that for
prog.sh n

print source code like case ... n: echo «» ecas.


for

prog.sh 55

anonymous
()

Добрый день в настоящее время пишу скрипт где нужно посчитать факториал для 30

Скрипт тут никак не подойдет, для этого разработаны специальные языки программирования.

https://www.haskell.org/

Im_not_a_robot ★★★★★
()

$ picolisp -«prinl (let f '((X)(if (<= X 1) 1 (* X (f (- X 1))))) (f 30))» -bye 265252859812191058636308480000000

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.