Soma de todos os inteiros entre dois números

4

Eu gostaria de digitar dois números e obter a soma de todos os inteiros entre esses dois números, inclusive.

Por exemplo:

./sum1 2 5

deve render

sum: 14

porque 2 + 3 + 4 + 5 = 14

Aqui está o que eu tenho até agora:

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"

Acho que preciso de outra variável para adicionar algo, mas não consigo encontrar uma boa solução.

    
por AtumRe 16.12.2015 / 16:29

4 respostas

2

Procure "avaliação aritmética" na documentação da sua shell. Por exemplo, no BASH, poderia ser:

n=0
for (( i = $num1; i <= $num2; i++)); do
    (( n += i ))
done
echo $n

Geralmente, se você pretende usar isso com frequência, deseja torná-lo uma função em vez de um script independente. Pode ser mais apropriado usar (( n = n + i )) , pois o operador += abreviado pode não estar disponível em algumas camadas que oferecem avaliação aritmética.

    
por 16.12.2015 / 16:31
13

Se você tiver um comando seq , a abordagem de força bruta:

$ seq 2 5 | paste -sd + - | bc
14

Então, como uma função:

sum() { seq "$@" | paste -sd + - | bc; }

A abordagem mais inteligente:

sum() { echo "$((($1+$2)*($2-$1+1)/2))"; }

Ou para obter a precisão de bc :

sum() { echo "($1+$2)*($2-$1+1)/2" | bc; }

A ideia é calcular:

2+3+4+5

Se você dobrar, você pode escrever:

 2+3+4+5
+5+4+3+2
 ───────
 7+7+7+7

Então, duas vezes a soma ( 2 * s ) é 4 ( b - a + 1 ) vezes 7 ( a + b ).

2 * s = (b - a + 1) * (a + b)

Então

s = (b - a + 1) * (a + b) / 2
    
por 16.12.2015 / 17:03
2

Por que ciclo?

read x y
echo $(( (y - x) * (y - x + 1) / 2 + (y - x + 1) * x ))

No shell puro, você precisa $(( ))

    
por 16.12.2015 / 16:58
2

Como acima mencionado, há uma fórmula para a soma de uma progressão aritmética:

Vejamais(provaeintrodução)no artigo da Wikipédia .

    
por 16.12.2015 / 19:16