如何在Bash脚本中找到数字的阶乘?

use*_*345 11 bash

在shell脚本中如何找到一个数字的阶乘?

pax*_*blo 10

没有这样做bash.聪明的人不会试图用鱼来砍伐树木,所以我的建议是尝试使用正确的工具来完成工作.

例如,您可以使用bc它来执行此操作:

pax> echo 'define f(x) {if (x>1){return x*f(x-1)};return 1}
           f(6)' | bc
720
pax> echo 'define f(x) {if (x>1){return x*f(x-1)};return 1}
           f(500)' | BC_LINE_LENGTH=99999 bc
12201368259911100687012387854230469262535743428031928421924135883858
45373153881997605496447502203281863013616477148203584163378722078177
20048078520515932928547790757193933060377296085908627042917454788242
49127263443056701732707694610628023104526442188787894657547771498634
94367781037644274033827365397471386477878495438489595537537990423241
06127132698432774571554630997720278101456108118837370953101635632443
29870295638966289116589747695720879269288712817800702651745077684107
19624390394322536422605234945850129918571501248706961568141625359056
69342381300885624924689156412677565448188650659384795177536089400574
52389403357984763639449053130623237490664450488246650759467358620746
37925184200459369692981022263971952597190945217823331756934581508552
33282076282002340262690789834245171200620771464097945611612762914595
12372299133401695523638509428855920187274337951730145863575708283557
80158735432768888680120399882384702151467605445407663535984174430480
12893831389688163948746965881750450692636533817505547812864000000000
00000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)

  • 同意.OTOH我发现自己在森林里有几次用锤子,黄油刀和忙碌箱.所以这应该被标记为"生存训练" (3认同)

Vit*_*nko 7

#!/bin/bash
counter=$1 #first argument
factorial=1
while [ $counter -gt 0 ] #while counter > 0
do
   factorial=$(( $factorial * $counter ))
   counter=$(( $counter - 1 ))
done
echo $factorial
Run Code Online (Sandbox Code Playgroud)


nos*_*nos 5

echo 500 | dc -e '?[q]sQ[d1=Qd1-lFx*]dsFxp'
Run Code Online (Sandbox Code Playgroud)

  • +1很好,虽然我不知道为什么它的工作;) (2认同)
  • @luther,像 bc、dc 这样的外部专用工具能够计算更大的数字。因此,它们是最适合这项工作的工具。bash 可以为更大的阶乘计算什么是有限制的。 (2认同)

Nor*_*ame 5

10!在bash中:

f=1; for k in {1..10}; do f=$[$k * $f] ; done; echo $f
Run Code Online (Sandbox Code Playgroud)

或按以下步骤逐步进行:

$ t=$(echo {1..10})
$ echo $t
1 2 3 4 5 6 7 8 9 10
$ t=${t// /*}
$ echo $t
1*2*3*4*5*6*7*8*9*10
$ echo $[$t]
3628800
Run Code Online (Sandbox Code Playgroud)


wlk*_*wlk 0

您必须使用循环,请参阅此链接:http://ubuntuforums.org/showthread.php ?t=1349272