2014-10-02 6 views
5

के बीच अंतर ठीक है तो यह एक हैकरैंक समस्या है (https://www.hackerrank.com/challenges/bash-tutorials---arithmetic-operations)। असल में, इनपुट एक अंकगणितीय अभिव्यक्ति है और मुझे स्वरूपित उत्तर (3 दशमलव स्थान) मुद्रित करना है। मैंने इसे पहलेprintf% .3f और बीसी राउंडिंग व्यवहार

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

... वैकल्पिक रूप से, '\' ... \ '' के बजाय '$ (...)' का उपयोग करें - यह आधुनिक पॉज़िक्स वाक्यविन्यास है, और घोंसला से कम भ्रमित है। –

+0

.... भी - 'echo "$ exp" | बीसी-एल', $ echo echo नहीं बीसी -एल'; यदि आपकी अभिव्यक्ति में '*' के आस-पास की जगहें हैं, तो आपको उद्धरण के बिना बहुत ही आश्चर्यजनक व्यवहार होगा (और यहां तक ​​कि रिक्त स्थान के बिना, यदि आपके खोल में 'nullglob' विकल्प सक्षम है तो आपको आश्चर्यजनक व्यवहार होगा)। –

उत्तर

5

कारण यह है कि दोनों भिन्न हैं bc हमेशा उन्हें गोल करने के बजाय संख्याओं को काटते हैं। अर्थात। echo "scale = 3 ; 8/9" | bc सही ढंग से गोल 0.88 के बजाय 0.888 उत्पन्न करता है।

आपका परीक्षण केस 17.928571429 पर मूल्यांकन करता है, जो आपके printf दृष्टिकोण के साथ 17.9 2 9 तक गोल होता है, लेकिन bc दृष्टिकोण के साथ 17.928 तक काट दिया जाता है।

2

मुझे लगता है कि समस्या scale = 3; भाग है। उदाहरण के लिए, यदि आप

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

का उपयोग करते हैं तो आपको 17.928 फिर से मिलेंगे। तो जवाब है कि आपको कम से कम 4 तक स्केल सेट करने की आवश्यकता है और फिर इसे तीन अंकों में प्रिंट करें।

1

समस्या गोलाई और/या महत्वपूर्ण अंकbc द्वारा दिया है। जब आप echoscale=3 के साथ उपयोग करते हैं तो आप केवल 3 अंक लौटने के लिए bc पर भरोसा कर रहे हैं। जब आप को केवल 3 दशमलव स्थानों (%.3f प्रारूप का उपयोग करके) के लिए बताते हैं, तो आप printf पर निर्भर हैं कि कौन से अंक निर्धारित करते हैं। अनिवार्य रूप से, अंतर bcscale=3 का उपयोग करके गोल करने में है और यह printf द्वारा %.3f रूपांतरण के साथ किया गया है।

+0

मुझे उम्मीद है कि मैं संपादन के साथ अजीब या भारी हाथ नहीं हूं। –

+0

नहीं - सही दिखता है। आपको आवश्यक सभी संपादकीय स्वतंत्रताएं लें :) –

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

ऊपर,, stdin से पूर्णांक पढ़ता रिक्त लाइनों को हटा, ई.पू. के लिए पाइप यह 4 अंक परिशुद्धता के साथ गणना प्रदर्शन करने के लिए तो printf की मदद से 3 अंक के लिए सही राउंडिंग के साथ यह प्रारूप। उपर्युक्त हैकररैंक समस्या का मेरा समाधान।

+2

कृपया कोड-केवल उत्तर डंप न करें।बताएं कि कोड का क्या अर्थ है – arco444

संबंधित मुद्दे