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

时间:2010-08-03 07:54:12

标签: bash

在shell脚本中如何查找数字的阶乘?

13 个答案:

答案 0 :(得分:15)

seq -s "*" 1 500 |bc

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分:5)

echo 500 | dc -e '?[q]sQ[d1=Qd1-lFx*]dsFxp'

答案 4 :(得分:4)

10!在bash:

f=1; for k in {1..10}; do f=$[$k * $f] ; done; echo $f

或者这里一步一步的方式:

$ 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

答案 5 :(得分:2)

这是Bash中的递归函数:

factorial () { 
    if (($1 == 1))
    then
        echo 1
        return
    else
        echo $(( $( factorial $(($1 - 1)) ) * $1 ))
    fi
}

当然,这是非常缓慢和有限的。

答案 6 :(得分:2)

echo Enter Number

read num
fact=1
for ((i=1;i<=num;i++))
do
fact=$(($fact*$i))
done
echo $fact

答案 7 :(得分:1)

有许多具有启发性的例子on Rosetta Code

这是我发现特别有用的一个:

function factorial {
  typeset n=$1
  (( n < 2 )) && echo 1 && return
  echo $(( n * $(factorial $((n-1))) ))
}

答案 8 :(得分:1)

请使用此脚本在Bash中找到factorial,

#!/bin/bash

num=$1
fact=1
for((i=1; i<=$num; i++))
do
        let fact=fact*i
done

echo "Factorial is $fact"

答案 9 :(得分:0)

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

答案 10 :(得分:0)

我几乎完全赞同Vitalii Fedorenko,我希望paxdiablo建议使用bc,这里是来自Vitalii Fedorenko的代码,但修改为使用bc

#!/bin/bash
counter=$1
output=1
while [ $counter -gt 1 ] #while counter > 1 (x*1=x)
do
        output=$(echo "$output * $counter" | bc)
        counter=$(($counter - 1))
done
#remove newlines and '\' from output
output=$(echo "$output" | tr -d '\' | tr -d '\n')
echo "$output"
exit

此方法更好,因为bc允许您使用字符串而不是整数,这样您就可以计算更大的数字。

如果我没有正确使用tr,我很抱歉,我对它不是很熟悉。

答案 11 :(得分:0)

seq -s* `dd`|bc

我相信这是完成任务的最短途径。

答案 12 :(得分:0)

您可以使用:

seq -s "*" 1 10 | sed 's/*$//g' |bc

在mac