两个超大数字求和

 

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
namespace ConsoleApplication1
{
    class Program
    {
        public static  string Fanzhuan(string c)  //倒序排列字符串
        {
            string Desvery = "";
            for (int i = c.Length - 1; i >= 0; i--)
            {
                Desvery += c[i].ToString();
            }
            return Desvery;
        }

 

        public static string BNum(string d)  
        {

            if (d.Length > 18) //判断所输入的字符串是否大于18
            {
                string  Desvery=Program.Fanzhuan(d);   //大于的话,先进行数据反转
                string Mid = Desvery.Substring(0,18);  //截取开始的18字符,也就是所谓的最低的位数,在计算加法的时候,一般都是从最后面的个位数,开始加起
                Desvery = Desvery.Remove(0, 18);  
                while (Desvery.Length > 18)
                {
                    Mid += ";" + Desvery.Substring(0, 18);
                    Desvery = Desvery.Remove(0, 18);
                }

                Mid += ";" + Desvery.Substring(0, Desvery.Length);
                return Mid;  //返回一个以 ";"为分隔符的字符串,每18位数字分割一次


            }
            else
            {
                return d;  //小于18位数,则不需要截取 ,可以直接计算,因为long的最大数字是 9,223,372,036,854,775,807 |||||一个19位数,如果小于18位数进行加,数字是不会溢出的
            }
        }

      


        public string Sum(string Num1,string Num2)  // 计算
        {
            string a= BNum(Num1); //获得一个经过筛选或者改变 的字符串
            string b = BNum(Num2);
            string JieGuo = "";  //用于返回的一个字符串
            if (a.IndexOf(';') == -1 && b.IndexOf(';') == -1)  //如果没有发现 ";"则说明可以直接进行计算
            {
                long d = long.Parse(a) + long.Parse(b);
             
                JieGuo = d.ToString();  

            }
            else if(a.IndexOf(';')==-1 && b.IndexOf(';')!=-1)  //如果一个是超大数字,一个不是 ,则进行下面的操作
            {
               string[] Number= b.Split(';');  //将超大的字符串分割为数组

               for (int d = 0; d 
< Number.Length; d++)
               {
                   Number[d] 
= Program.Fanzhuan(Number[d]);   //第一次调用BNum()的时候,进行了一次反向排序,例如开始是(123)反向则是(321),用于计算的必须的原来的值,所以这里要换回原来的值
               }

               long k
=long.Parse(Number[0]) + long.Parse(a);  //计算  (a小于18位 所以没有进行任何操作,直接计算)
               

                if(k.ToString().Length
>18)  //如果相加的和大于18位,则说明要向前面 进一 ( 例如 两个两位数相加 27+98=125 125是一个三位数大于两位数) 
                {
                   
                    long zzz=long.Parse(Number[1])+1; //进一位
                    Number[1]=zzz.ToString();
                    Number[0] = k.ToString().Substring(1,18); //舍去进的一,支取后面18位
                   
                      for(int i=Number.Length-1;i>=0;i--)
                      {
                          JieGuo+=Number[i]; //返回结果
                      } 
                   
                }else
                {
                      Number[0] = k.ToString();  //否则 不用进一 直接考虑加就可以了
                      for (int i = Number.Length - 1; i >= 0; i--)
                      {
                          JieGuo += Number[i];//返回结果
                      } 
          
                }
               
           }
           else if (b.IndexOf(';') == -1 && a.IndexOf(';')!=-1) //同上
           {

               string[] Number1 = a.Split(';');
               for (int d = 0; d 
< Number1.Length; d++)
               {
                   Number1[d] 
= Program.Fanzhuan(Number1[d]);
               
}

               long k
= long.Parse(Number1[0]) + long.Parse(b);

              if(k.ToString().Length
>18)
                {
                    long zzz=long.Parse(Number1[1])+1;
                    Number1[1]=zzz.ToString();
                    Number1[0] = k.ToString().Substring(1, 18);

                    for (int i = Number1.Length - 1; i >= 0; i--)
                    {
                        JieGuo += Number1[i];
                    } 
                  // return JieGuo;
               }
              else
              {
                      Number1[0] = k.ToString();
                      for (int i = Number1.Length - 1; i >= 0; i--)
                      {
                          JieGuo += Number1[i];
                      } 
                   //  return JieGuo;
              }

           } 
           else if (b.IndexOf(';') != -1 && a.IndexOf(';') != -1)  //如果两个都是庞大的数字 
           {
               string[] Number2 = a.Split(';');
               string[] Number3 = b.Split(';');

 

               for (int d = 0; d 
< Number2.Length; d++)
               {
                   Number2[d] 
= Program.Fanzhuan(Number2[d]);
               
}

               for (int d 
= 0; d < Number3.Length; d++)
               {
                   Number3[d] 
= Program.Fanzhuan(Number3[d]);
               
}

               if(Number2.Length
>Number3.Length)  //第一个大于第二个数字 
               {

                   String[] Ax = new string[Number2.Length];  //新建一个数组
                   for (int i = 0; i 
< Number3.Length; i++)  //(考虑到数组越界的情况,一定用长度小的那个作为遍历的条件)
                   {

                    long k
= long.Parse(Number2[i]) + long.Parse(Number3[i]);

 

                    if (i 
> 0)  //从第二次开始要计算是否要进 一
                    {
                        if (Ax[i - 1].Length > 18) //如果前面的数字之和大于18位 ,则进 一
                        {
                            Ax[i - 1] = Ax[i - 1].Substring(1, 18); // 并且改变上一个的长度
                            long ck = k + 1;
                            Ax[i] = ck.ToString();
                        }
                        else
                        {
                            Ax[i] = k.ToString();
                        }
                    }
                    else
                    {
                        Ax[i] = k.ToString();  //第一次的值就存入数组
                    }

                       if (i == Number3.Length - 1)
                       {
                           for (int s = i+1; s 
< Number2.Length; s++) //将多出来的数字 ,即高位数字,直接添加到数组当中
                           {
                               Ax[s] 
= Number2[s];
                           
}
                       }

                   }
                   for(int i
=0;i<Ax.Length;i++)
                   
{
                       JieGuo +
= Ax[i];  //返回结果
                   }

               }
               else if (Number2.Length < Number3.Length)  //同上
               {
                   String[] Ax 
= new string[Number3.Length];
                   for (int i 
= 0; i < Number2.Length; i++)
                   {

                       long k 
= long.Parse(Number2[i]) + long.Parse(Number3[i]);


                     //  Ax[i] 
= k.ToString();
                       
if (i > 0)
                       {
                           if (Ax[i - 1].Length > 18)
                           {
                               Ax[i - 1] = Ax[i - 1].Substring(1, 18);
                               long ck = k + 1;
                               Ax[i] = ck.ToString();
                           }
                           else
                           {
                               Ax[i] = k.ToString();
                           }
                       }
                       else
                       {
                           Ax[i] = k.ToString();
                       }

                       if (i == Number2.Length - 1)
                       {
                           for (int s = i + 1; s 
< Number3.Length; s++)
                           {
                               Ax[s] 
= Number3[s];
                           
}
                       }

                   }
                   for (int i 
= 0; i < Ax.Length; i++)
                   {
                       JieGuo +
= Ax[i];
                   
}
               }
               else    //基本同上 ,有一点小的区别
               {
                    String[] Ax 
= new string[Number3.Length];
                    for (int i 
= 0; i < Number2.Length; i++)
                    {
                        long k 
= long.Parse(Number2[i]) + long.Parse(Number3[i]);

                        
                        if (i 
> 0)
                        {
                            if (Ax[i - 1].Length > 18)
                            {
                                Ax[i - 1] = Ax[i - 1].Substring(1, 18);
                                long ck = k + 1;
                                Ax[i] = ck.ToString();
                            }
                            else
                            {
                                Ax[i] = k.ToString();
                            }
                        }
                        else
                        {
                            Ax[i] = k.ToString();
                        }

                    }
                    for (int i = Ax.Length-1; i >=0; i--)
                    {
                        JieGuo += Ax[i];
                    }
               }
              

           }
           return JieGuo;
        }
        static void Main(string[] args)
        {

           Program a = new Program();
           Console.Write("输入第一个数字:");
           string c = Console.ReadLine();
           Console.Write("输入第二个数字:");
           string d = Console.ReadLine();
           Console.WriteLine("输入第三个数字:" + a.Sum(c, d));
           Console.ReadLine();
            
        }
    }
}

posted @ 2007-06-26 09:41  lijun  阅读(662)  评论(0)    收藏  举报