none
遇到一个越界的小问题。大神来 RRS feed

  • 问题

  • long nfact = 1;
                long ncom = Int64.Parse("2000");
                long ncur = 1;
                for (ncur = 1; ncur <= ncom; ncur++)
                {
                    checked
                    {
                        Console.WriteLine(ncur);
                        nfact *= ncur;
                    }
                }
                Console.WriteLine("{0}! is {1}",ncom,nfact);

    运行到21的时候提示算数计算导致溢出。

    2013年4月6日 3:06

答案

  • 当然。你的nfact溢出了。

    如果要进行大数字的相乘,我建议你使用BigInteger:

     BigInteger b = new BigInteger(1);
            for (int i = 2i <=2000i++)
            {
               b= BigInteger.Multiply(b,i);
            }
            Console.WriteLine(b);

    注意引用System.Numeric命名空间:


    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats

    2013年4月6日 8:07

全部回复

  • 当然。你的nfact溢出了。

    如果要进行大数字的相乘,我建议你使用BigInteger:

     BigInteger b = new BigInteger(1);
            for (int i = 2i <=2000i++)
            {
               b= BigInteger.Multiply(b,i);
            }
            Console.WriteLine(b);

    注意引用System.Numeric命名空间:


    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats

    2013年4月6日 8:07
  • 因为确实会溢出,一个不使用BigInteger的替代方法是使用ulong,因为阶乘总是非负的。当然这么做并不是一个总是有效的方法,受到ulong的限制,总有一天你需要BigInteger。

    2013年4月19日 14:37
  • 大数相乘问题,把整数化为字符串型比较好。另外,微软应该有支持大数的自定义类型
    2013年5月25日 13:23