2011-10-24 75 views
0
class LargeNumberPb 
{ 
    Stack s1; 
    Stack s2; 
    Stack res; 
    string first; 
    string second; 

    public LargeNumberPb() 
    { 
     first = "10"; 
     second = "11"; 
     s1 = new Stack(); 
     s2 = new Stack(); 
     res = new Stack(); 
    } 

    public void Fill() 
    { 
     for (int i = 0; i < first.Length; i++) 
     { 
      s1.Push(first.Substring(i,1)); 
     } 
     for (int i = 0; i < second.Length; i++) 
     { 
      s2.Push(second.Substring(i,1)); 
     } 
    } 

    public Stack Sum() 
    { 
     for (int i = 0; i < s.Count; i++) 
     { 
      res.Push(Convert.ToInt32(s1.Pop()) + Convert.ToInt32(s2.Pop())); 
     } 
     return res; 
    } 
} 

我想解決添加大量問題,使用堆棧。但是如果兩個數字分別是100和11,那麼運輸方向會怎樣?如何用堆棧添加大量數據?

+0

1.如果兩個數字是100和11,則不會有任何進位。 2.你爲什麼試圖用堆棧來解決這個問題? 3.你知道.NET已經有內置的bignum支持嗎? http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.aspx –

+0

這是一個計算器練習的課堂作業嗎? –

+0

假設兩個數字是8和9呢?我想實現它像431236748491238564356823這樣的數字。 –

回答

0

您只需要一個變量即可繼續。當你從staks中彈出數字並添加它們時,如果有繼續,則將該值分配給具有的額外變量。這就是你真正需要的。

public Stack Sum() 
{ 
    int carry = 0 ; 
    for (int i = 0; i < s.Count; i++) 
    { 
     int sum = Convert.ToInt32(s1.Pop()) + Convert.ToInt32(s2.Pop()) + carry; 
     if(sum > 10) { carry = 1} else {carry = 0;} // you might want to check more than 10 here 
     res.push(sum); 
    } 
    return res; 
} 
+0

然後我也會需要推進價值結果堆棧?或者我不得不做一些其他的事情 –

+0

不,你不需要爲每一個添加推送進位,你需要添加進位,到下一個添加,如果沒有下一個添加,你需要推進堆疊。想想加法。寫下兩個數字並添加它們。 – DarthVader

1

如果兩個號碼具有同等位數計數剛修好的總和功能(只辦理攜帶,代碼未測試):

public Stack Sum() 
{ 
    int carry = 0; 
    int count = s1.Count; 
    for (int i = 0; i < count; i++) 
    { 
     var result = Convert.ToInt32(s1.Pop()) + Convert.ToInt32(s2.Pop()) 
        + carry; 
     res.Push(result%10); 
     carry = (result - result % 10)/10; 
    } 

    var carryStream = carry.ToString(); 
    for(int i=carryStream.Length-1;i>=0;i--) 
    { 
     res.push(Convert.ToInt32(carryStream.Substring(i,1); 
    } 
    return res; 
} 

編輯:,這是不同長度的剪輯版字符串:

 public Stack Sum() 
     { 
      int carry = 0; 
      int count = Math.Min(s1.Count, s2.Count); 
      for (int i = 0; i < count; i++) 
      { 
       var result = Convert.ToInt32(s1.Pop()) + Convert.ToInt32(s2.Pop()) 
          + carry; 
       res.Push(result % 10); 
       carry = (result - result % 10)/10; 
      } 

      var carryStream = carry.ToString(); 
      var remainedStack = s1.Count > 0 ? s1 : s2; 
      carry = 0; 
      for (int i = carryStream.Length - 1; i >= 0; i--) 
      { 
       var result = Convert.ToInt32(carryStream.Substring(i, 1)) 
      + (remainedStack.Count > 0 ? Convert.ToInt32(remainedStack.Pop()) : 0); 
       res.Push(result % 10); 
       carry = (result - result % 10)/10; 
      } 

      if (remainedStack.Count > 0) 
      { 
       int remainedCount = remainedStack.Count; 
       for (int i = 0; i < remainedStack.Count; i++) 
       { 
        var result = carry + Convert.ToInt32(remainedStack.Pop()); 
        res.Push(result % 10); 
        carry = (result - result % 10)/10; 
       } 

      } 

      if (carry != 0) 
       res.Push(carry); 

      return res; 
     }