2017-01-20 6 views
5

में आधुनिक से परिणाम के लिए सकारात्मक संकेत प्राप्त करने के लिए जब भोलेपन से आधुनिक आदेश बैश में अवशिष्ट नकारात्मक अंश के लिए गलत संकेत हो जाता है (मेरी राय में) का उपयोग:कैसे बैश

तो मैं लिखना:

for i in {-5..5}; do echo $(($i % 3)) ; done 

मैं (एक पंक्ति के रूप में) उत्पादन

-2 -1 0 -2 -1 0 1 2 0 1 2 

मैं कैसे "सही" व्यवहार प्राप्त करते हैं पाने

1 2 0 1 2 0 1 2 0 1 2 
+2

संबंधित: [नकारात्मक ऑपरेंड, बग या फीचर के साथ मॉड्यूल ऑपरेटर?] (Http://www.unix.com/shell-programming-and-scripting/260045-newbie-question-modulo-operator-negative-operand- bug-feature.html) – fedorqui

उत्तर

3

Add 3 और फिर Mod 3 परिणामों के पहले सेट करने के लिए:

$ for i in {-5..5}; do printf "%d " $(((($i % 3) + 3) % 3)) ; done 
1 2 0 1 2 0 1 2 0 1 2 

आप अधिकतम सीमा जानते हैं, तो आप सिर्फ एक काफी बड़ा पर्याप्त एकाधिक 3 के जोड़ सकते हैं सभी नंबरों को पहले सापेक्ष ऑपरेशन से पहले सकारात्मक बनाने के लिए ।

$ for i in {-5..5}; do printf "%d " $((($i + 3000000) % 3)) ; done 

हालांकि, पहली दृष्टिकोण स्पष्ट और अधिक सार्वभौमिक है।

अन्त में, मनोरंजन के लिए:

positive_mod() { 
    local dividend=$1 
    local divisor=$2 
    printf "%d" $(((($dividend % $divisor) + $divisor) % $divisor)) 
} 

for i in {-5..5}; do 
    printf "%d " $(positive_mod $i 3) 
done 
+1

सामान्य रूप से, परिणाम को सकारात्मक होने तक आप संख्यात्मक में 3 जोड़ सकते हैं, * फिर * 3 से विभाजित करें। '(j + k * 3)% 3 == j% 3' सभी के लिए '। – chepner

+1

@chepner: आप यह कर सकते हैं, लेकिन आप वास्तव में कभी नहीं जानते कि कितनी बड़ी 'के' की आवश्यकता है। यदि आप पहले मॉड्यूलस के बाद पूरा ऑपरेशन करते हैं, तो हम जानते हैं कि 'k = 1'। – Harvey

+0

आह, ठीक है, मैंने जो किया वह गलत है। – chepner

2

wikipedia नकारात्मक संकेत के अनुसार की अनुमति है।

[a mod n का परिणाम] यह अभी भी एक संकेत है अस्पष्टता छोड़ देता है, तो शेष अशून्य है: शेष के लिए दो संभावित विकल्प होते हैं, भागफल के लिए एक नकारात्मक और अन्य सकारात्मक है, और दो संभावित विकल्प होते हैं। आम तौर पर, संख्या सिद्धांत में, सकारात्मक शेष हमेशा चुना जाता है, लेकिन प्रोग्रामिंग भाषाएं भाषा या ए या एन के संकेतों के आधार पर चुनती हैं।

तो यह परिभाषित करने के लिए प्रोग्रामिंग भाषा पर निर्भर है। चूंकि बैश स्पष्ट रूप से "ऋणात्मक शेष" तरीके से चला गया है जिससे आप बच सकते हैं उदा। इस तरह पर्ल:

for i in {-5..5}; do perl -le "print $i%3"; done 

यह प्रत्येक पूर्णांक के लिए व्यक्तिगत रूप से पर्ल दुभाषिया शुरू करने की कीमत पर है।

दरअसल! चूंकि ओपी सही गणित के बारे में परवाह करता है, इसलिए आप python जैसे कुछ पर स्विच करने पर विचार कर सकते हैं और वहां लूपिंग और सब कुछ कर सकते हैं।

+1

यह प्रत्येक पूर्णांक के लिए अलग-अलग पर्ल दुभाषिया लॉन्च करने की लागत पर है। यह काम करता है, लेकिन मुझे लगता है कि पर्ल से बचने वाला थोड़ा लंबा समाधान प्रदर्शन के लायक है और बाह्य निर्भरता से परहेज करता है। – Fred

+0

जब मैं गलत कहता हूं, तो मैं संख्या सिद्धांत का परिप्रेक्ष्य ले रहा हूं। –

+0

@Fred: अच्छा बिंदु, मैंने इसे उत्तर में जोड़ा – hansaplast