2011-04-10 9 views
10

समस्या समस्या के लिए समाधान समझा एक (एन + 1) -लेमेंट सरणी में बाइनरी रूप में संग्रहीत। समस्या को औपचारिक रूप से बताएं और दो पूर्णांक जोड़ने के लिए छद्म कोड लिखें।कृपया मुझे करने के लिए नीचे

समाधान:

  1. सी ← [1 ... n + 1] ▹ सी है शून्य से भरे।
  2. मैं के लिए n करने के लिए ← 1
  3. कर राशि ← एक [i] + बी [i] + सी [i]
  4. सी [i] ← योग% 2
  5. सी [i + 1] ← योग/2 ▹ इंटीजर विभाजन।
  6. उत्पादन सी ​​

प्रश्न:

  1. मैंने सोचा था कि सी [मैं] एक [मैं] + बी [i] क्यों आप जोड़ रहे हैं योग ← एक [i] + बी [i है ] + सी [i] चरण 3 में?
  2. क्यों योग% 2 (क्यों चरण 4 में उपयोग करने के लिए सापेक्ष की ज़रूरत है?)
  3. क्यों योग/2 (क्यों चरण 5 में विभाजन का उपयोग करने की आवश्यकता है?)

आप असली के साथ समाधान ऊपर समझाने कृपया सकते हैं उदाहरण? धन्यवाद।

+0

विचार करें कि आप _by हैंड_ दशमलव संख्या जैसे '17 9 + 256' कैसे जोड़ते हैं। आप अंकों से अंकों को काम करते हैं, 'सेल' में बाएं से बड़े किसी भी परिणाम को 'ले जाने' के लिए ... हाथ से दशमलव जोड़ों के कुछ उदाहरणों को काम करने का प्रयास करें, फिर बाइनरी जोड़ों को आजमाएं। :) – sarnold

उत्तर

15

सी समाधान और वाह दोनों दोनों है। एक वास्तविक उदाहरण के लिए, मैं कोष्ठक में दशमलव)

A = 1011 (11) + B = 0011 (3) [C starts as 00000 (0)] 
    ^   ^     ^

^पहला स्थान को चिह्नित के साथ बाइनरी में लिखेंगे के 11 + 3 जोड़ने, और हम, छोड़ जाने के बाद से हम बाएं से दाएं पढ़ते हैं, लेकिन गणित छोड़ने के लिए सही चला जाता है। इसके अलावा, हम पूर्णांक विभाजित करते हैं, इसलिए 3/2 = 1, 1.5 नहीं। अब कदम।

1. sum = 1+1+0 = 10 (2), c[1] = 2 % 2 = 0, c[2] = 2/2 = 1 
2. sum = 1+1+1 = 11 (3), c[2] = 3 % 2 = 1, c[3] = 3/2 = 1 
3. sum = 0+0+1 = 01 (1), c[3] = 1 % 2 = 1, c[4] = 1/2 = 0 
4. sum = 1+0+0 = 01 (1), c[4] = 1 % 2 = 1, c[5] = 1/2 = 0 
^  ^^^       ^
i  A B C, all at position i   note that we store the carry for the NEXT step 

परिणाम: सी = 01110 (14)

+1

एक बहुत स्पष्ट उत्तर के लिए धन्यवाद! – Mayumi

5
  1. आप C[i] जोड़ने के रूप में अच्छी तरह से क्योंकि C[i] से जब आप पिछले चरण में A[i-1] + B[i-1] + C[i-1] जोड़ा एक कैरी सा हो सकती है। उदाहरण के लिए यदि हम 1 + 1 करते हैं, तो हमारा पहला पुनरावृत्ति sum = 1 + 1 + 0 = 2 है, लेकिन चूंकि यह बाइनरी है, इसलिए हमें 1 ले जाना होगा और इसे C[1] पर रखना होगा और C[0] में शेष (2 % 2 = 0) डालें। यह हमें 10
  2. C[i] योग% 2 मिलता है क्योंकि A[i] + B[i] + C[i] की राशि 1 से अधिक हो सकती है, लेकिन 1 उस अंक में सबसे अधिक फिट होगा। बाकी राशि (अगर कोई है) ले जाने के लिए रखा जाएगा। और यह हमें लाता है ...
  3. C[i+1]sum/2 असाइन किया गया है क्योंकि sum/2 वाहक राशि है। i = i + 1 के लिए हम A[i] + B[i] + C[i] करते समय अगले पुनरावृत्ति में इसका उपयोग करेंगे।
+0

बहुत सहज और स्पष्ट उत्तर के लिए धन्यवाद! – Mayumi

4

आप आधार 10 संख्याओं को जोड़ने के तरीके में द्विआधारी संख्याओं को जोड़ने के बारे में सोच सकते हैं: प्रत्येक अंक पर प्रदर्शन करने के लिए "add" चरण और "वाह" चरण होता है।

तो, चलिए एक समय में गणित को थोड़ा सा लेते हैं। मान लें कि हम जोड़ रहे हैं:

 
101 
+ 
011 

पहले चरण के लिए, हम दूर-दराज पर शुरू होते हैं। (आपके उदाहरण में, यह i = 1 से मेल खाता है)। हम जोड़ते हैं (1 + 1)% 2, जो हमें देता है 0. वास्तव में क्या चल रहा है? 1 + 1 2 है, जो बाइनरी में दो अंकों का नंबर है ("10")। हम केवल निम्न-आदेश अंक ("0") लिख सकते हैं, इसलिए योग "एक्सप्रेस 2" को व्यक्त करना वास्तव में केवल यह कह रहा है "अब के लिए कैर-ओवर योग के बारे में चिंता न करें।" इसलिए हम मिल गया है:

 
101 
+ 
011 
--- 
    0 (carrying a 1) 

अब हम लागू "एक 1 ले" पूर्णांक विभाजन करके ("योग/2"), और अस्थायी रूप से भंडारण:

 
101 
+ 
011 
--- 
10 

अब हम दूसरे अंक जोड़ने के लिए तैयार हैं: (0 + 1)% 2 - लेकिन हमें कैर-ओवर 1 में जोड़ना होगा जिसे हम ट्रैक रखते रहे हैं, इसलिए हम (0 + 1 + 1)% 2 उपज लेते हैं:

 
101 
+ 
011 
--- 
00 

फिर हमें tr रखने की आवश्यकता है बिट कैरी की पावती, हमें दे रही है (0 + 1 + 1) = 1:

 
101 
+ 
011 
--- 
1000 
: जवाब देने के लिए (1 + 0 + 1)% 2:

 
101 
+ 
011 
--- 
100 

अंत में हम 3 बिट्स जोड़ने

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