我试图在Bash中这样做:
read n
echo int(math.ceil((math.sqrt(1 + 8 * n) - 1) / 2))
当然这不是合法的语法,但我只是把它放在那里,这样你就可以告诉我想要做什么。
有没有一种简单的方法可以将其变为有效的Bash?
答案 0 :(得分:2)
虽然你要求在Bash中执行此操作,但是对于平方根或天花板等功能没有原生支持。委托给Perl会更简单:
perl -wmPOSIX -e "print POSIX::ceil((sqrt(1 + 8 * $n) - 1) / 2)"
或者,您可以使用bc
来计算平方根,并使用一些Bash来计算上限。
让我们定义一个函数,用sqrt
bc
打印公式的结果:
formula() {
local n=$1
bc -l <<< "(sqrt(1 + 8 * $n) - 1) / 2"
}
-l
标志将scale
从默认值0更改为20。
这会影响浮点结果显示的比例。
例如,默认为零,10 / 3
将仅打印3。
我们需要在下一步中使用浮点详细信息来计算上限。
ceil() {
local n=$1
local intpart=${n%%.*}
if [[ $n =~ \.00*$ ]]; then
echo $intpart
else
echo $((intpart + 1))
fi
}
这里的想法是提取整数部分, 如果小数部分全部为零,那么我们只打印整数部分, 否则整数部分+ 1,因为它是上限。
最后一个简单的函数,结合上述函数来获得你想要的结果:
compute() {
local n=$1
ceil $(formula $n)
}
还有一个检查功能来测试它:
check() {
local n num
for n; do
num=$(formula $n)
echo $n $num $(compute $n)
done
}
让我们试一试:
check 1 2 3 4 7 11 12 16 17
它产生:
1 1.00000000000000000000 1
2 1.56155281280883027491 2
3 2.00000000000000000000 2
4 2.37228132326901432992 3
7 3.27491721763537484861 4
11 4.21699056602830190566 5
12 4.42442890089805236087 5
16 5.17890834580027361089 6
17 5.35234995535981255455 6
答案 1 :(得分:1)
您可以使用sqrt
的{{1}}功能。
echo "(sqrt(1 + 8 * 3) - 1) / 2" | bc
Ceil
函数可以使用本答案中描述的任何方法实现。
例如:
ceiling_divide() {
ceiling_result=`echo "($1 + $2 - 1)/$2" | bc`
}
答案 2 :(得分:1)
您可以将bc用于所有作业
$>cat filebc
print "Enter a number\n";
scale=20
a=read()
b=((sqrt(1 + 8 * a) - 1) / 2)
scale=0
print "ceil = ";
((b/1)+((b%1)>0))
quit
将其称为
bc -q filebc