我在c#里使用Int64,UInt64进行两个整数的相加都会出现溢出,请问有什么办法可以解决
如果有字符串可以解决,怎么解决

解决方案 »

  1.   

    重新写一个支持大数的运类算,把数字当做string然后再设计算法.
      

  2.   

    参考下老外的处理方法 http://www.codeproject.com/KB/cs/BN.aspx
      

  3.   

    大数相加都用string,把两个string当数组用,搞个变量存进位,还是蛮好解决的
      

  4.   

    public static string DaisuTasu(string str1,string str2)
    {
    int a=str1.Length;
    int b=str2.Length;
    int[] it;
    if(a>b)
    {
    it=new int[a+1];
    for(int i=0;i<it.Length;i++)
    {
    it[i]=0;
    }
    int j=b-1;
    for(int i=a-1;i>=0;i--)
    {
    int x=int.Parse(str1[i].ToString());
    int y=0;
    if(j>=0)
    {
    y=int.Parse(str2[j].ToString());
    }
    it[i+1]=x+y;
    j--;
    }
    }
    else
    {
    it=new int[b+1];
    for(int i=0;i<it.Length;i++)
    {
    it[i]=0;
    }
    int j=a-1;
    for(int i=b-1;i>=0;i--)
    {
    int x=int.Parse(str2[i].ToString());
    int y=0;
    if(j>=0)
    {
    y=int.Parse(str1[j].ToString());
    }
    it[i+1]=x+y;
    j--;
    }
    }
    string returnValue=string.Empty;
    for(int i=it.Length-1;i>0;i--)
    {
    if(it[i]>=10)
    {
    int m=it[i]%10;
    int n=it[i]/10;
    it[i]=m;
    it[i-1]=n+it[i-1];
    }
    returnValue=it[i].ToString()+returnValue;
    }
    if(it[0]!=0)
    {
    returnValue=it[0]+returnValue;
    }
    return returnValue;
    }
      

  5.   

    浏览器不支持发c#代码
    private string Keisan(string str1,string str2)
    {
    int a=str1.Length;
    int b=str2.Length;
    int[] it=new int[a+b];
    for(int i=0;i<it.Length;i++)
    {
    it[i]=0;
    }
    int[] aa=new int[a];
    int[] bb=new int[b];
    for(int i=0;i<a;i++)
    {
    aa[i]=int.Parse(str1[i].ToString());
    }
    for(int i=0;i<b;i++)
    {
    bb[i]=int.Parse(str2[i].ToString());
    } for(int i=a-1;i>=0;i--)
    {
    for(int j=b-1;j>=0;j--)
    {
    it[i+j+1]=it[i+j+1]+aa[i]*bb[j];
    }
    } StringBuilder returnValue = new StringBuilder(""); 
    for(int i=a+b-1;i>0;i--)
    {
    if(it[i]>=10)
    {
    int m=it[i]%10;
    int n=it[i]/10;
    it[i]=m;
    it[i-1]=n+it[i-1];
    }
    returnValue.Insert(0,it[i].ToString());
    }
    if(it[0]!=0)
    {
    returnValue.Insert(0,it[0]);
    } return returnValue.ToString();
    }
      

  6.   

    class Program
        {         
            static void Main(string[] args)
            {
                Int64 numA = 1234560000000000;
                UInt64 numB = 987654320000000000;            string strNumA = Fun(numA.ToString());
                string strNumB = Fun(numB.ToString());
                string ans = "";
                int flag = 0;
                if (strNumA.Length < strNumB.Length)
                {
                    for (int i = 0;i < strNumB.Length ; i++)
                    {
                        int temp = 0;
                        if (i < strNumA.Length)
                            temp = Int32.Parse(strNumA[i].ToString()) + Int32.Parse(strNumB[i].ToString());
                        else
                            temp = Int32.Parse(strNumB[i].ToString());
                        temp += flag;
                        flag = 0;
                        if (temp > 9)
                        {
                            temp = temp % 10;
                            flag = 1;
                        }
                        ans += temp.ToString();
                    }                
                }
                Console.WriteLine(Fun(ans));
                Console.Read();
            }        static string Fun(string str)
            {
                string newString = "";
                for (int i = str.Length - 1; i >= 0; i--)
                {
                    newString += str[i].ToString();
                }
                return newString;
            }
        }
      

  7.   


        class Program
        {
            static void Main(string[] args)
            {
                Int64 numA = -1;
                UInt64 numB = 1234560000000000;            string strNumA = Fun(numA.ToString());
                string strNumB = Fun(numB.ToString());
                int sign = 0;
                if (strNumA[strNumA.Length - 1].ToString() == "-")
                    sign = -1;
                else
                    sign = 1;
                strNumA = strNumA.Replace("-", "");            Console.WriteLine(Fun(GetSum(strNumA, strNumB, sign)));
                Console.Read();
            }        static string Fun(string str)
            {
                string newString = "";
                for (int i = str.Length - 1; i >= 0; i--)
                {
                    newString += str[i].ToString();
                }
                return newString;
            }        static string GetSum(string strNumA, string strNumB, int sign)
            {
                string ans = "";
                int flag = 0;
                if (strNumA.Length > strNumB.Length)
                {
                    string strTemp = strNumA;
                    strNumA = strNumB;
                    strNumB = strTemp;
                }            for (int i = 0; i < strNumB.Length; i++)
                {
                    int temp = 0;
                    if (i < strNumA.Length)
                        temp = sign * Int32.Parse(strNumA[i].ToString()) + Int32.Parse(strNumB[i].ToString());
                    else
                        temp = Int32.Parse(strNumB[i].ToString());
                    temp += flag;
                    flag = 0;
                    
                    if (temp > 9)
                    {
                        flag = 1;
                    }
                    if (temp < 0)
                    {
                        temp = temp + 10;
                        flag = -1;
                    }
                    temp = temp % 10;
                    ans += temp.ToString();
                }
                return ans;
            }
        }    之前的代码只考虑了Int64的数比UInt64的数小的情况,也没考虑Int64的数小于0的情况,汗自己一个
      

  8.   


    先声明类型再相加long a = 345466;
    long b = 456456;
    long c = a + b;不要long c = 345466 + 456456;
    因为编译器会把345466 + 456456编译成int a = 345466;
    a += 456456;所以会溢出
      

  9.   

        /// <summary>
            /// 将字符串转换成整型数组
            /// </summary>
            /// <param name="A"></param>
            /// <returns></returns>
            int[] ConvertStrToArray(string A)
            {
                int[] str=new int[A.Length];            for (int i = 0; i < A.Length; i++)
                {
                    str[i] = Convert.ToInt32(A.Substring(A.Length - 1 - i, 1));
                }
                return str;
            }        /// <summary>
            /// 将整型数组转换成字符串
            /// </summary>
            /// <param name="A"></param>
            /// <returns></returns>
            string ConvertArrayToStr(int[] A)
            {
                int length = 0;             if (builder == null)
                        builder = new StringBuilder();            builder.Remove(0,builder.ToString().Length);            length = A.Length - (A[A.Length - 1] != 0 ? 0 : 1);            for (int i = length; i > 0; i--)
                    builder.Append(A[i - 1].ToString());            return builder.ToString();
            }        /// <summary>
            /// 两个字符串相加
            /// </summary>
            /// <param name="A"></param>
            /// <param name="B"></param>
            /// <returns></returns>
            string OperationAdd(string A, string B)
            {
                int[] strA = ConvertStrToArray(A);            int[] strB = ConvertStrToArray(B);            int[] newStr = new int[Math.Max(A.Length, B.Length) + 1];            int i, rem = 0;            bool incFl;            for (i = 0; i <newStr.Length; i++)
                {
                    newStr[i] = (strA.Length > i ? strA[i] : 0);
                }            for (i = 0; i < strB.Length; i++)
                {
                    if (newStr[i] + strB[i] + rem >= 10)
                    {
                        newStr[i]+=strB[i] + rem - 10;
                        rem = 1;
                    }
                    else
                    {
                        newStr[i] += strB[i] + rem;
                        rem = 0;
                    }
                }            /*判断最后一位是否要进一位*/
                while (rem == 1)
                {
                    incFl = (newStr[i] == 9);
                    newStr[i++] += (incFl ? -9 : 1);
                    rem = (incFl ? 1 : 0);            
                }            return ConvertArrayToStr(newStr);
            }