两个数字之间所有整数的总和

两个数字之间所有整数的总和

我想输入两个数字并获取这两个数字之间(包括这两个数字)之间的所有整数的总和。

例如:

./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 中你需要$(( ))

答案4

正如上面提到的,等差数列的总和有一个公式:

求和公式

查看更多内容(证明和介绍)维基百科文章

相关内容