比如要计算一个很大的数!比如说100000的阶乘`改怎么解决!``谢谢各位!`

解决方案 »

  1.   

    你上www.google.com搜索"高精度乘法"在里边找找都可以找到的,软件名称HugeCalc.exe和Factorial.exe,AutomorphicNumber.exe,PrimeNumber.exe它们的用途不同,Factorial.exe是用来算阶乘的,确实有那么快,不过是用标准c++编出来的,具体算法当然是保密的了,只知道是用了STL技术。
    我也明白楼上的意思,具体的算法不得而知。
      

  2.   

    2004.05.08 Ver2.0.1.1    ⊙ 充分运用数论知识优化算法    ⊙ 改进了(双)阶乘、排列、组合等算法,速度提高 25% 左右    ⊙ Factorial.exe 可选是否需输出到窗口(因为“写屏”太费时间)    ⊙ 新增软件 PrimeNumber.exe,可生成不大于指定自然数的所有素数
    2004.04.27 Ver1.2.0.1    ⊙ 优化了乘法群组运算算法    ⊙ 改进了开任意次方的算法    ⊙ 改进了(双)阶乘的算法    ⊙ Factorial.exe 进行格式化输出    ⊙ Factorial.exe 可将结果保存成文件    ⊙ 不再发布 UNICODE 版的 HugeCalc
    2004.04.08 Ver1.1.0.1    ⊙ HugeCalc.dll 导出函数新增到 169 个    ⊙ 改进了乘法算法
    2004.03.29 Ver1.0.1.1    ⊙ HugeCalc.dll 导出函数达到 97 个    ⊙ 新增配套软件 HugeCalc.exe,虽然仅使用了部分功能,但已很强大    ⊙ 不再提供自由的 Demo&Test 源代码
    2004.03.15    ⊙ 新增软件 Factorial.exe,可快速计算(双)阶乘,可独立运行
    2004.03.02 Ver1.0.0.1    ⊙ 发布该算法库 HugeCalc.dll 雏形    ⊙ 同时提供 Demo&Test 源代码(含 UNICODE 版)
    这是一套绿色免安装免费软件:Ver2.0.1.1⊙ AutomorphicNumber 自守数问题,1s 内破“世界纪录”。⊙ PrimeNumber 素数生成器,可迅速生成不大于指定自然数的所有素数,并可格式化输出。⊙ Factorial (双)阶乘快速计算器,核心算法源于 HugeCalc,可独立运行于 Win95 以上平台,速度一流(尚未发现比之更快的软件)!⊙ HugeCalc 超大整数高精度快速计算器/算法库(附精心制作的 chm 帮助文档),功能非常强大。最新版下载地址:⊙http://maths.myrice.com/software.htm#02
    ⊙http://www.cccen.com/web/math/software.htm#02
    ⊙http://www.freewebs.com/maths/software.htm#02
      

  3.   

    用斯特林公式计算吧public class Test {    public static void main(String[] args) {
            stirling(10000);
        }
        
        /**
         * Stirling:
         * n! = sqrt(2 * pi * n) * pow(n / e, n)
         * @param n
         */
        private static void stirling(int n) {
            double a = n * Math.log10(n / Math.E);
            double s = 0.5 * Math.log10(2 * Math.PI * n);
            double base10 = a + s;
            int exponent = (int)base10;
            double base = Math.pow(10, base10 - exponent);
            System.out.println(n + "! = " + base + " * 10^" + exponent);
        }
    }100000! = 2.8242270545605797 * 10^456573结果虽然不是很精确,但是位数和头几位是精确的。
      

  4.   

    采用 log 法可以获得更高的精度,当然了复杂度也由 Stirling 的 O(1) 升为 O(N) 了。    /**
         * n! = 1 * 2 * 3 * ... * (n - 1) * n
         * log(n!) = log(1) + log(2) + log(3) + ... + log(n - 1) + log(n)
         * @param n
         */
        private static void logFactorial(int n) {
            double sum = 0;
            for(int i = 1; i <= n; i++) {
                sum += Math.log10(i);
            }
            int exponent = (int)sum;
            double base = Math.pow(10, sum - exponent);
            System.out.println(n + "! = " + base + " * 10^" + exponent);        
        }100000! = 2.8242294097488676 * 10^456573
      

  5.   

    上传答案```
    #include<iostream>
    using namespace std;
    void main()
    {
    int Data[40];
        int Digit;
        int i,j,r,k;
        int N;
        for(i=1;i<40-1;i++)
         Data[i] = 0;
        Data[0]=1;
        Data[1]=1;
        Digit = 1;
        printf("Enter a number what you want to calculus: ");
        scanf("%d",&N);
        for(i=1;i<N+1;i++)
        {
         for(j=1;j<Digit+1;j++)
             Data[j] *= i;
            for(j=1;j<Digit+1;j++)
            {
             if(Data[j]>10)
                {
                 for(r=1;r<Digit+1;r++)
                    {
                     if(Data[Digit]>10)
                         Digit++;
                        Data[r+1] += Data[r]/10;
                        Data[r] = Data[r]%10;
                    }
                }
            }
            printf("%d! = ",i);
            for(k=Digit;k>0;k--)
             printf("%d",Data[k]);
            printf("\n");
        }
        system("pause");
    }