【问题标题】:How to adding large number with stack?如何用堆栈添加大数?
【发布时间】:2011-12-14 07:35:14
【问题描述】:
    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,那么进位会去哪里?

【问题讨论】:

  • 1.如果这两个数字是 100 和 11,则不会有任何进位。 2. 你为什么要尝试使用堆栈来解决这个问题? 3. 你知道.NET 已经内置了 bignum 支持吗? msdn.microsoft.com/en-us/library/…
  • 这是一个计算器练习的课堂作业吗?
  • 假设两个数字是 8 和 9 那么呢?我想为像 431236748491238564356823 这样的数字实现它。
  • 你这样做是为了加二进制数吗?
  • 我认为他想添加二进制数?我错了吗?

标签: c# algorithm visual-studio-2010 data-structures stack


【解决方案1】:

如果两个数字的位数相等,只需修复 sum 函数(仅处理进位,代码未经测试):

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;
        }

【讨论】:

    【解决方案2】:

    您只需要一个变量即可继续。当您从 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;
    }
    

    【讨论】:

    • 那么我是否还需要将继续值推送到结果堆栈?或者我必须做点别的事情
    • 不,每次加法都不需要推carry on,需要加carry on,下一次加法,如果没有下一次加法,需要推carry on堆。考虑加法。写下两个数字并将它们相加。
    猜你喜欢
    • 1970-01-01
    • 2021-04-15
    • 2013-12-24
    • 2011-09-29
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多