c#中一个更简单的大加法器?

时间:2009-08-27 11:13:48

标签: c# largenumber

我刚在学校完成了写一个大加法器的任务。意思是一种可以将非常大的数字放在一起的方法。 我们有10分钟,我按时完成了。老师认可了。

我对结果不太满意,我认为我可能采取了错误的方法。

这是我的版本:

using System;
using System.Text;

namespace kæmpe_adder
{
    static class Program
    {
        static void Main()
        {
            var x = "1111";
            var y = "111111111";

            Console.WriteLine(BigAdder(x, y));
            Console.ReadLine();
        }
        public static StringBuilder BigAdder(string x, string y)
        {
            var a = new StringBuilder(x);
            var b = new StringBuilder(y);
            return BigAdder(a, b);
        }
        public static StringBuilder BigAdder(StringBuilder x, StringBuilder y)
        {
            int biggest;
            int carry = 0;
            int sum;
            var stringSum = new StringBuilder();

            if (x.Length > y.Length)
            {
                y.FillString(x.Length - y.Length);
                biggest = x.Length;
            }
            else if (y.Length > x.Length)
            {
                x.FillString(y.Length - x.Length);
                biggest = y.Length;
            }
            else
            {
                biggest = y.Length;
            }

            for (int i = biggest - 1; i >= 0; i--)
            {
                sum = Convert.ToInt32(x[i].ToString()) + Convert.ToInt32(y[i].ToString()) + carry;
                carry = sum / 10;
                stringSum.Insert(0, sum % 10);
            }

            if (carry != 0)
            {
                stringSum.Insert(0, carry);
            }

            return stringSum;
        }
        public static void FillString(this StringBuilder str, int max)
        {
            for (int i = 0; i < max; i++)
            {
                str.Insert(0, "0");
            }
        }
    }
}

当我写这篇文章时,我想到了你是如何用二进制文件做的。

是否有更短和/或更简单的方法来做到这一点?

2 个答案:

答案 0 :(得分:1)

从代数的角度来看,您的代码看起来是正确的。从设计的角度来看,您肯定更愿意将这些大数字封装在一个类中,这样您就不必一直引用字符串/字符串构建器。我也不是这种FillString方法的忠实粉丝,在两个数字都具有非零值的情况下添加数字似乎更合理,然后只需将进位添加到更大的数字,直到完成为止。

不确定二进制文件的问题是什么?正常长度数(32位和64位)由CPU作为单个操作添加。

答案 1 :(得分:1)

有许多开源实现可供您寻找灵感。

http://www.codeproject.com/KB/cs/biginteger.aspx

http://biginteger.codeplex.com/

一般情况下,我建议使用byte或long数组以获得最佳性能,但从字符串到数组的转换将是非常重要的。

以相反的顺序存储数字;这使得找到相同的地方变得微不足道。

这样可以更容易地添加不同大小的字符串数字:

int place = 0;
int carry = 0;

while ( place < shorter.Length ) {
    result.Append (AddDigits (longer[place], shorter[place], ref carry));
    ++place;
}

while ( place < longer.Length ) {
    result.Append (AddDigits (longer[place], 0, ref carry));
    ++place;
}

if ( carry != 0 )
    result.Append (carry.ToString ());