关于大数相乘 溢出的问题

Posted wanglgkaka

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于大数相乘 溢出的问题相关的知识,希望对你有一定的参考价值。

今天在开发过程中遇到很奇怪的问题,几个正整数相乘竟然出现了负数,

debug的提示是 checked模式下,整型溢出

原来是数据相乘后超过了int32的数据范围。

在网上看了一下解决方案

转自:http://www.cnblogs.com/Alpha-Fly/archive/2012/04/02/2429756.html

 一 加载system.Numerics 类库

1 BigInteger num1 = BigInteger.Parse("乘数一");
2 BigInteger num2 = BigInteger.Parse("乘数二");
3 Console.WriteLine(num1* num2);
4 Console.ReadKey();

 

二 

static string getbackresult(string s1, string s2)
            {
                string lastResult = "";
                int ten1 = -1;
                int[] result = new int[s1.Length + s2.Length];//用以记录计算结果
                for (int i = s1.Length - 1; i >=0; i--)
                {
                    int c1 = Convert.ToInt16(s1[i].ToString());//从s1中从后往a前取一个数并记录这个数的位置
                    ten1++;
                    int resultindex = result.Length - 1 - ten1;
                    for (int j = s2.Length - 1; j >=0; j--)
                    {
                        int c2 = Convert.ToInt16(s2[j].ToString());//从?s2中从后往前取一个数
                        int cc = c1 * c2 + result[resultindex];
                        if (cc > 10)
                        {
                            result[resultindex] = cc % 10;
                            int lastindex = resultindex - 1;  //往前移动一位
                            int lastvalue = result[lastindex] + cc / 10;  //把刚刚得到的十位的数字赋值到前面
                            while (cc > 10)
                            {
                                cc = result[lastindex] + cc / 10;
                                result[lastindex] = cc % 10;
                                lastindex--;//进位
                            }
                        }
                        else
                        {
                            result[resultindex] = cc;
                        }
                        resultindex--;//进位
                    }
                }
                StringBuilder sb = new StringBuilder();
                foreach (int item in result)
                {
                    sb.Append(item);
                }
                lastResult = sb.ToString();
                if (lastResult[0]==\'0\')
                {
                    lastResult = lastResult.Substring(1);
                }
                return lastResult;
            }

以上是关于关于大数相乘 溢出的问题的主要内容,如果未能解决你的问题,请参考以下文章

大数相乘的快速乘技巧

大数乘法

大数相乘相加相减相除

实现两个大数相乘

Karatsuba乘法--实现大数相乘

求解Catalan数,(大数相乘,大数相除,大数相加)