C#超大整数的加减法

简单示例,理论支持无限位加减

    if (GUILayout.Button(" string Add"))
        {
           string v= AddOrReduceStrings("3091345589131",
               "3091345589131");
            string j = AddOrReduceStrings("5678931",
              "43229",2);
            Debug.Log(v);
            Debug.Log(j);
        }

具体实现

    /// <summary>
    /// 字符串加减法
    /// </summary>
    /// <param name="num1"></param>
    /// <param name="num2"></param>
    /// <param name="type"> 1 add  2reduce </param>
    /// <returns></returns>
    public static string AddOrReduceStrings(string num1, string num2, int type = 1)
    {
        num1 = num1.TrimStart('0');
        num2 = num2.TrimStart('0');
        if (type == 2)
        {
            //以小减大直接返回0
            if (num2.Length > num1.Length)
            {
                return "0";
            }
            else if (num2.Length == num1.Length)
            {
               

                for (int i = 0; i < num1.Length; i++)
                {
                    int p = int.Parse(num1.Substring(i, 1));
                    int p2 = int.Parse(num2.Substring(i, 1));
                    if (p < p2)
                    {
                        return "0";
                        //break;
                    }
                }

            
            }

        }
        

        //定义一个大1位的数组
        var max = Math.Max(num1.Length, num2.Length) + 1;
        var total = new int[max];
        //向左补0到相同数量,否则需要额外处理边界
        num1 = num1.PadLeft(max, '0');
        num2 = num2.PadLeft(max, '0');
        //进位标识
        var carry = false;
        var sum = 0;
        //借位标识
        var reduce = false;
        if (type == 1)
        {
            for (int i = max - 1; i >= 0; i--)
            {
                sum = int.Parse(num1[i].ToString()) + int.Parse(num2[i].ToString());
                if (carry) sum++;
                total[i] = int.Parse(sum.ToString()[sum.ToString().Length - 1].ToString());
                carry = sum > 9;
            }
        }
        else
        {
            for (int i = max - 1; i >= 0; i--)
            {
                var n1 = int.Parse(num1[i].ToString());
                var n2 = int.Parse(num2[i].ToString());
                if (reduce)
                {
                    n1--;
                }

                if (n1.CompareTo(n2) < 0)
                {
                    sum = n1 + 10 - n2;
                }
                else
                {
                    sum = n1 - n2;
                }
                //if (reduce)
                //{
                //    sum--;
                //}
                total[i] = int.Parse(sum.ToString()[sum.ToString().Length - 1].ToString());


                reduce = n1.CompareTo(n2) < 0;

             
            }
        }

        //定义结果
        var res = string.Empty;
        //遍历输出到res
        total.ToList().ForEach(r => { res += r.ToString(); });

        Debug.Log("{0}={1}={2}={3}".Format(type, num1, num2, res));

        //取消最高位0
        res = res.TrimStart('0');
        //如果空了,返回0
        if (res.Length == 0) res = "0";


        //返回结果
        return res;
    }


福利赠送

 public static string NumFormat(this string _num, params object[] _values)
    {
        var outStr = "";
        var len = _num.Length;

        if (len > 4)
        {
            outStr = string.Format("{0}K",_num.ToString().Substring(0, len - 3));

        }
        else if (len > 5)
        {
            outStr = string.Format("{0}万", _num.ToString().Substring(0, len - 4));
        }
        //x.ToString("###,###")   或  1234567.ToString("N0") 

        // C#中把数字转换成带两位小数的千分位字符:

        // 如1234567.891变成1,234,567.89

        //方法:String.Format("{0:N}", 1234567.891);   //默认为两位小数,如果没有小数位,则小数位补两个0

        //或:String.Format("{0:N2}", 1234567.891);

        return outStr;
    }
发布了54 篇原创文章 · 获赞 37 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/osuckseed/article/details/103427549