我想输入两个数字并获取这两个数字之间(包括这两个数字)之间的所有整数的总和。
例如:
./sum1 2 5
应该产生
sum: 14
因为 2+3+4+5 = 14
这是我到目前为止所拥有的:
read num1 num2
for (( i=$num1; i<=$num2; i++))
do
now how to do what i want
done
echo "The Sum of your two number and the numbers inbetween is:$i"
我想我需要在那里添加另一个变量,但我似乎找不到一个好的解决方案。
答案1
如果您有seq
命令,则可以使用暴力方法:
$ seq 2 5 | paste -sd + - | bc
14
所以作为一个函数:
sum() { seq "$@" | paste -sd + - | bc; }
更聪明的方法:
sum() { echo "$((($1+$2)*($2-$1+1)/2))"; }
或者获得bc
的精度:
sum() { echo "($1+$2)*($2-$1+1)/2" | bc; }
这个想法是计算:
2+3+4+5
如果你加倍,你可以写成:
2+3+4+5
+5+4+3+2
───────
7+7+7+7
所以两倍的总和 ( 2 * s
) 是 4 ( b - a + 1
) 乘以7
( a + b
)。
2 * s = (b - a + 1) * (a + b)
所以
s = (b - a + 1) * (a + b) / 2
答案2
寻找「算术评估」在你的 shell 文档中。例如,在 BASH 中,它可能是:
n=0
for (( i = $num1; i <= $num2; i++)); do
(( n += i ))
done
echo $n
一般来说,如果您打算经常使用它,您希望将其作为一个函数而不是一个独立的脚本。使用它可能更合适,(( n = n + i ))
因为缩短的+=
运算符在某些提供算术评估的 shell 中可能不可用。
答案3
为什么要骑自行车?
read x y
echo $(( (y - x) * (y - x + 1) / 2 + (y - x + 1) * x ))
在纯 shell 中你需要$(( ))