首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >阶乘方法不能很好地工作!

阶乘方法不能很好地工作!
EN

Stack Overflow用户
提问于 2010-10-11 19:12:48
回答 6查看 2.3K关注 0票数 6

你好,这是一个阶乘方法,但它在控制台中打印0,请帮助我,谢谢

代码语言:javascript
运行
复制
public class Demo {

    public static void main(String[] args) {
        Demo obj = new Demo();
        System.out.println(obj.factorial(500));
    }

    public int factorial(int n) {
        int fact = 1;

        for (int i = 2; i <= n; i++) {
            fact= fact*i;
        }
        return fact;
    }

编辑:将返回无限!

代码语言:javascript
运行
复制
public class Demo {

    public static void main(String[] args) {
        Demo obj = new Demo();
        System.out.println(obj.factorial(500));
    }

    public double  factorial(long n) {
       double fact = 1;

        for (int i = 2; i <= n; i++) {
            fact= fact*i;
        }
        return fact;
    }
}
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-10-11 19:20:09

因为500!等于1220136825991110068701238785423046926253574342803192842192413588385845373153881997605496447502203281863013616477148203584163378722078177200480785205159329285477907571939330603772960859086270429174547882424912726344305670173270769461062802310452644218878789465754777149863494367781037644274033827365397471386477878495438489595537537990423241061271326984327745715546309977202781014561081188373709531016356324432987029563896628911658974769572087926928871281780070265174507768410719624390394322536422605234945850129918571501248706961568141625359056693423813008856249246891564126775654481886506593847951775360894005745238940335798476363944905313062323749066445048824665075946735862074637925184200459369692981022263971952597190945217823331756934581508552332820762820023402626907898342451712006207714640979456116127629145951237229913340169552363850942885592018727433795173014586357570828355780158735432768888680120399882384702151467605445407663535984174430480128938313896881639487469658817504506926365338175055478128640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,所以不能将它放入int (最大范围为2147483647)。

12!.

  • Using a

  • 使用int你最多只能存储一个long你会得到一个double你会得到一个你会得到一个int

这是一个使用BigInteger的解决方案

代码语言:javascript
运行
复制
public static BigInteger factorial(int i) {
    BigInteger n = BigInteger.valueOf(i);
    while (--i > 0)
        n = n.multiply(BigInteger.valueOf(i));
    return n;
}
票数 19
EN

Stack Overflow用户

发布于 2010-10-11 19:15:18

你不可能在32位int上安装500!

对于涉及大数的计算,请考虑使用doubleBigInteger,具体取决于您需要的是近似答案还是确切答案。

(实际上,对于500!,即使是一个double也是不够的:Double.MAX_VALUE是1.7976931348623157E+308,它将“只”让您使用170!)

票数 4
EN

Stack Overflow用户

发布于 2010-10-11 21:06:16

如果您需要计算阶乘函数,您应该考虑两件事:

1) Memoization。这将极大地加快计算速度,因为阶乘函数具有递归定义。您所做的是缓存以前的计算,因此当您请求k!时,如果您缓存了(k-1)!,则可以通过计算k*((k-1)!)一步获得它。

2) Stirling's approximation。如果你需要计算大的阶乘,你可以用这种方法非常快速地近似它们,并保证误差的范围,这样你就可以判断对于你的应用来说,近似是否可以接受。

如果您不这样做,您会发现有一些相对较小的k无法在合理的时间内计算出k!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3905658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档