나는 배쉬에서이 작업을 수행하려고 : 물론이 구문을 작동하지 않습니다하지만 당신은 내가 뭘하려고 오전 알 수 있도록 그냥 거기를 걸었습니다이 계산을 수행하고 표준 출력으로 어떻게 출력합니까?
read n
echo int(math.ceil((math.sqrt(1 + 8 * n) - 1)/2))
.
실제로 유효한 배쉬로이 할 수있는 가장 쉬운 방법이 있습니까?
나는 배쉬에서이 작업을 수행하려고 : 물론이 구문을 작동하지 않습니다하지만 당신은 내가 뭘하려고 오전 알 수 있도록 그냥 거기를 걸었습니다이 계산을 수행하고 표준 출력으로 어떻게 출력합니까?
read n
echo int(math.ceil((math.sqrt(1 + 8 * n) - 1)/2))
.
실제로 유효한 배쉬로이 할 수있는 가장 쉬운 방법이 있습니까?
배시에서이 작업을 수행하도록 요청했지만은, 제곱근 또는 천장과 같은 기능에 대한 네이티브 지원이 없습니다. 펄에 위임하는 것이 더 간단 할 것이다 :
perl -wmPOSIX -e "print POSIX::ceil((sqrt(1 + 8 * $n) - 1)/2)"
또는, 제곱근을 계산하는 bc
를 사용할 수 있으며, 일부 배쉬 천장을 계산합니다.
이제 sqrt
bc
의 함께하기 식의 결과를 출력하는 함수를 정의하자
formula() {
local n=$1
bc -l <<< "(sqrt(1 + 8 * $n) - 1)/2"
}
-l
플래그 20 이에 디폴트 0에서 scale
변경 부동의 디스플레이의 크기에 영향을 미친다 포인트 결과. 는 예를 들어, 기본 0으로, 10/3
은 3 우리가 필요로하는 다음 단계에서 부동 소수점 세부 사항은 천장을 계산하기 위해 인쇄 할 것이다.
ceil() {
local n=$1
local intpart=${n%%.*}
if [[ $n =~ \.00*$ ]]; then
echo $intpart
else
echo $((intpart + 1))
fi
}
여기 아이디어는 정수 부분, 를 추출하고 소수 부분 모두 0 인 경우, 우리는 단순히 정수 부분을 인쇄, 그렇지 않으면 그 천장와 같이 정수 부분 + 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
당신은 bc
의 sqrt
기능을 사용할 수 있습니다.
echo "(sqrt(1 + 8 * 3) - 1)/2" | bc
Ceil
함수는이 응답에 기술 된 방법을 사용하여 구현 될 수있다. 예를 들어
:
ceiling_divide() {
ceiling_result=`echo "($1 + $2 - 1)/$2" | bc`
}
내가 작성한 것을 올바르게 구현 한 경우 수식이 4, 7, 11, 12, 16, 17 ...과 같은 값을 갖지 못합니다. –
당신은
$>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
전화를 bash``에는`sqrt` 운영자가 확실히 없어 그
bc -q filebc
같은 모든 작업에 BC를 사용할 수 있습니다. –
sqrt 함수를 직접 작성해야합니까? – user8926565
도움이되는지 모르겠지만'(8n + 1)'이 홀수이므로 'sqrt (8n + 1)'이 정수 값인 경우에는 홀수 여야합니다. 따라서'(1)'을 빼고'(2) '로 나누는 것은 항상 정수가됩니다. 따라서'(n)'이 정수'(k)'에 대해'k (k + 1)/2'로 표현 될 수 있다면 결과는 정수입니다. 그렇지 않으면 정수 부분에 1을 더하십시오. –