2017-11-12 1 views
4

나는 배쉬에서이 작업을 수행하려고 : 물론이 구문을 작동하지 않습니다하지만 당신은 내가 뭘하려고 오전 알 수 있도록 그냥 거기를 걸었습니다이 계산을 수행하고 표준 출력으로 어떻게 출력합니까?

read n 

echo int(math.ceil((math.sqrt(1 + 8 * n) - 1)/2)) 

.

실제로 유효한 배쉬로이 할 수있는 가장 쉬운 방법이 있습니까?

+1

같은 모든 작업에 BC를 사용할 수 있습니다. –

+0

sqrt 함수를 직접 작성해야합니까? – user8926565

+0

도움이되는지 모르겠지만'(8n + 1)'이 홀수이므로 'sqrt (8n + 1)'이 정수 값인 경우에는 홀수 여야합니다. 따라서'(1)'을 빼고'(2) '로 나누는 것은 항상 정수가됩니다. 따라서'(n)'이 정수'(k)'에 대해'k (k + 1)/2'로 표현 될 수 있다면 결과는 정수입니다. 그렇지 않으면 정수 부분에 1을 더하십시오. –

답변

2

배시에서이 작업을 수행하도록 요청했지만은, 제곱근 또는 천장과 같은 기능에 대한 네이티브 지원이 없습니다. 펄에 위임하는 것이 더 간단 할 것이다 :

perl -wmPOSIX -e "print POSIX::ceil((sqrt(1 + 8 * $n) - 1)/2)" 

또는, 제곱근을 계산하는 bc를 사용할 수 있으며, 일부 배쉬 천장을 계산합니다.

이제 sqrtbc의 함께하기 식의 결과를 출력하는 함수를 정의하자

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 
1

당신은 bcsqrt 기능을 사용할 수 있습니다.

echo "(sqrt(1 + 8 * 3) - 1)/2" | bc 

Ceil 함수는이 응답에 기술 된 방법을 사용하여 구현 될 수있다. 예를 들어

Getting Ceil integer

:

ceiling_divide() { 
     ceiling_result=`echo "($1 + $2 - 1)/$2" | bc` 
    } 
+0

내가 작성한 것을 올바르게 구현 한 경우 수식이 4, 7, 11, 12, 16, 17 ...과 같은 값을 갖지 못합니다. –

1

당신은

$>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 
관련 문제