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

c#中更简单的大加法器?,c#,largenumber,C#,Largenumber,我在学校的任务是写一个大加法器。这意味着一种可以把非常大的数字放在一起的方法。 我们有10分钟,我确实按时完成了。老师同意了 不过,我对结果不太满意,我认为我可能采取了错误的方法 以下是我的版本: using System; using System.Text; namespace kæmpe_adder { static class Program { static void Main() { var x = "1111

我在学校的任务是写一个大加法器。这意味着一种可以把非常大的数字放在一起的方法。 我们有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");
            }
        }
    }
}
使用系统;
使用系统文本;
名称空间kæmpe_加法器
{
静态类程序
{
静态void Main()
{
var x=“1111”;
var y=“111111111”;
控制台写入线(大加法器(x,y));
Console.ReadLine();
}
公共静态StringBuilder BigAdder(字符串x、字符串y)
{
var a=新的StringBuilder(x);
var b=新的StringBuilder(y);
返回大加法器(a,b);
}
公共静态StringBuilder BigAdder(StringBuilder x、StringBuilder y)
{
int最大;
整数进位=0;
整数和;
var stringSum=新的StringBuilder();
如果(x.长度>y.长度)
{
y、 填充字符串(x.长度-y.长度);
最大=x.长度;
}
否则如果(y长度>x长度)
{
x、 填充字符串(y.长度-x.长度);
最大=y.长度;
}
其他的
{
最大=y.长度;
}
对于(int i=最大值-1;i>=0;i--)
{
sum=Convert.ToInt32(x[i].ToString())+Convert.ToInt32(y[i].ToString())+carry;
进位=总和/10;
stringSum.Insert(0,总和%10);
}
如果(进位!=0)
{
stringSum.插入(0,进位);
}
返回字符串和;
}
公共静态void FillString(此StringBuilder str,int max)
{
对于(int i=0;i
当我写它的时候,我想到了如何使用二进制文件


有没有一种更短和/或更简单的方法可以做到这一点?

从代数的角度看,您的代码看起来是正确的。从设计的角度来看,您肯定更愿意将这些大数字封装在一个类中,这样您就不必一直引用字符串/字符串生成器。我也不太喜欢这种填充字符串的方法,当两个数字都有非零值时添加数字似乎更合理,然后只需将进位添加到较大的数字,直到完成为止


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

您可以从许多开源实现中获得灵感

一般来说,我建议使用字节数组或长数组以获得最佳性能,但从字符串到数组的转换将非常重要

按相反顺序存储数字;这使得寻找等效位置变得微不足道

这使得添加不同大小的字符串和数字更容易:

int-place=0;
整数进位=0;
while(位置<较短的长度){
追加(AddDigits(长[place],短[place],ref-carry));
++地点;
}
while(位置<较长的长度){
追加(AddDigits(更长的[place],0,ref-carry));
++地点;
}
如果(进位!=0)
result.Append(carry.ToString());

请注意,这不是学校作业。我确实完成了作业,现在我只是对自己的问题感到好奇。对不起,我只是想解释一下为什么我会想到这种方法。我的方法与添加二进制数的方法相似。谢谢你的反馈!这个转换可以吗?List xIntArray=x.Select(c=>(字节)(c-'0')).ToList();这比字符串(1字节而不是每位数2字节)稍微好一点,但要真正发挥字节数组的威力,您需要使用以256为基数的算术,而不仅仅是每字节一个十进制数字。正如我所说,转换是非常重要的。对于课堂练习来说,弦乐就足够了。以相反的顺序存储数字才是真正的关键。
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 ());