두 숫자를 입력하고 이 두 숫자 사이(포함)의 모든 정수의 합을 구하고 싶습니다.
예를 들어:
./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
찾다"산술 평가"쉘 문서에서. 예를 들어 BASH에서는 다음과 같을 수 있습니다.
n=0
for (( i = $num1; i <= $num2; i++)); do
(( n += i ))
done
echo $n
일반적으로 자주 사용할 계획이라면 독립형 스크립트보다는 함수로 사용하는 것이 좋습니다. 산술 평가를 제공하는 일부 쉘에서는 (( n = n + i ))
단축 +=
연산자를 사용하지 못할 수 있으므로 이를 사용하는 것이 더 적절할 수 있습니다 .
답변3
왜 자전거를 타나요?
read x y
echo $(( (y - x) * (y - x + 1) / 2 + (y - x + 1) * x ))
순수한 쉘에서는 다음이 필요합니다.$(( ))