2014-10-02 2 views
5

그래, 이것이 해커 란 문제 (https://www.hackerrank.com/challenges/bash-tutorials---arithmetic-operations)입니다. 기본적으로 입력은 산술 표현식이며 형식화 된 응답 (소수점 이하 3 자리)을 인쇄해야합니다. 나는 이것을 처음 시도했다.printf % .3f와 bc 반올림 동작의 차이점

read exp 
echo "scale = 3; $exp" | bc -l 

몇 가지 테스트를 통과했지만 첫 번째 테스트는 통과하지 못했다.

5+50*3/20 + (19*2)/7 대답은 17.929이지만 내 코드는 17.928입니다. 이 코드를 대신

read exp 
printf "%.3f\n" `echo $exp | bc -l` 

주를 시도 : 에코 부분은 역 따옴표에 있어야하지만 블록 따옴표와 혼동하지 않도록 ''했습니다. 모든 검사가 통과되었습니다. 차이점은 무엇입니까?

+0

역행은 한 줄 미만의 코드 서식에만 적합합니다. 여러 줄로 된 세그먼트의 경우 코드 서식에 들여 쓰기를 사용합니다 (코드 단추를 클릭하면 자바 스크립트 편집기에서 수행 할 작업). –

+0

... 번갈아서,'\'... \''대신에'$ (...)'을 사용하십시오. 이것은 현대적인 POSIX 문법이고, 중첩하는 것이 덜 어렵습니다. –

+0

.... 또한 -'echo "$ exp"| bc -l'이 아니라'echo $ exp | bc -l'; 표현식에'*'주위에 공백이 있으면 따옴표없이 매우 놀랄만 한 행동을 보입니다 (공백 없이도 쉘에'nullglob' 옵션이 활성화 된 경우 놀라운 동작을 보입니다). –

답변

5

두 가지가 다른 이유는 bc이 숫자를 반올림하지 않고 항상 자릅니다. I. e. echo "scale = 3 ; 8/9" | bc은 정확하게 반올림 한 0.889 대신 0.888을 생성합니다.

테스트 케이스는 printf 접근 방식으로 17.929로 반올림 한 17.928571429로 평가되지만 bc 접근 방식으로 17.928로 절단됩니다.

2

문제는 scale = 3; 부분이라고 생각합니다. 예를 들어, 사용하는 경우

 printf "%.3f\n" ` echo "scale = 3 ; $exp " | bc -l` 

다시 17.928을 얻게됩니다. 그래서 답은 적어도 4로 스케일을 설정 한 다음 3 자리로 인쇄해야합니다.

1

문제는 반올림 및/또는 bc에 의해 반환 된 유효 숫자입니다. echoscale=3과 함께 사용하면 bc을 사용하여 3 자리 만 반환합니다. printf소수 자릿수 3 개를 출력한다고 말하면 (%.3f 형식을 사용하는)을 사용하면 printf을 사용하여 숫자를 결정할 수 있습니다. 본질적으로, 차이는 bc에 의해 행해진 반올림에 scale=3을 사용하고 printf에 의해 행해지는 것은 %.3f 변환의 두 배입니다.

+0

나는 편집으로 무섭지 않거나 무거워지기를 바란다. –

+0

Nope - 완벽 해 보인다. 필요한 편집상의 자유를 모두 누리세요. –

0
v=$(sed 's/[[:blank:]]//g') 
(echo "scale=4"; echo $v) | bc | xargs printf '%.3f' 

상기는 표준 입력의 정수를 읽어 블랭크 라인을 제거, bc에 파이프를 4 자리수의 정밀도 연산을 수행하기 위해, 다음의 printf의 도움으로 3 자리 올바른 라운딩을 포맷. 위에서 언급 한 HackerRank 문제에 대한 나의 해결책.

+2

코드 전용 답변을 덤프하지 마십시오.코드의 의미를 설명하십시오. – arco444