Java 析因法不';工作不好!

Java 析因法不';工作不好!,java,math,factorial,Java,Math,Factorial,嗨 这是一个阶乘方法,但它在控制台中打印0。请帮助我,谢谢 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

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

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;
    }
公共类演示{
公共静态void main(字符串[]args){
Demo obj=新的Demo();
系统输出println(对象阶乘(500));
}
公共整数阶乘(整数n){
int-fact=1;

对于(int i=2;i您无法在32位
int
上安装
500!

关于大数的计算,考虑使用<代码>双< /代码>或A,这取决于你是否想要一个近似的或确切的答案。 (实际上,对于

500!
,即使是
double
也不够:
double.MAX_值
是1.7976931348623157E+308,这将“仅”让您上升到
170!

-这几乎肯定是由整数溢出引起的

如果您使用更适度的输入测试方法,它似乎会返回正确的输出:

public static void main(String[] args) {
   Demo obj = new Demo();
   for (int i = 0; i < 10; i++)
      System.out.println(i + "! = " + obj.factorial(i));
} 
publicstaticvoidmain(字符串[]args){
Demo obj=新的Demo();
对于(int i=0;i<10;i++)
系统输出println(i+“!=”+obj.factorial(i));
} 

500!
大规模的;在测试功能时,从较小的输入开始是谨慎的。

因为
500!
等于
12201368259991110068701238785423046926255742803192219241358838584537315388199760549644750328186301367714820341633787220781772004807520932825847790757193037760859086270429174547882424912726344305670173270769461062802310452644218878789465754777149863494367781037644274033827365397471386477878495438489595537537990423241061271326984327745715546309977202781014561081188373709531016356324432987029563896628911658974769572087926928871281780070265174507768410719624390394322536422605234945850129918571501248706961568141625359056693423813008856249246891564126775654481886506593847951775360894005745238940335798476363944905313062323749066445048824665075946735862074637925184200459369692981022263971952597190945217823331756934581508552332820762820023402626907898342451712006207714640979456116127629145951237229913340169552363850942885592018727433795173014586357570828355780158732768888680120399882384702151467605445407663535984174430480128931389681639474696588175045069263338175055478128640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

  • 使用
    int
    最多只能存储
    12!
  • 使用
    long
    你最多可以得到
    20!
  • 使用
    double
    您将得到
    170!
下面是一个使用
biginger
的解决方案:

public static BigInteger factorial(int i) {
    BigInteger n = BigInteger.valueOf(i);
    while (--i > 0)
        n = n.multiply(BigInteger.valueOf(i));
    return n;
}

500!
太大了,装不下长的或双人的。
您必须使用其他技术来实现此目的


但是首先,什么样的程序需要
500!

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

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

2) 。如果您需要计算大阶乘,您可以通过这种方式非常快速地对其进行近似,并保证误差范围,这样您就可以判断近似值是否适合您的应用程序


如果你不做这两项,你会发现有一些相对较小的
k
,你根本无法在合理的时间内计算
k!

对于分解的实现有一些非常好的优化:例如,请参阅Java中的一个很好的实现。有些需要更多的优化hematical insight然后其他人…从库中获得乐趣:-)

使用BigInteger man!首先了解您的语言。\m/非常感谢您的回答!:)为了提高性能,您还可以先检查i,如果需要,切换到BigInteger^!这将是一个小的改进,因为它只针对非常小的输入值优化方法。什么类型的程序需要500!?组合数学问题通常都有非常大的数字。@Tony,我的意图是告诉OP,他的500!案例可能与他的案例无关。也许措辞拙劣。
public static BigInteger factorial(int i) {
    BigInteger n = BigInteger.valueOf(i);
    while (--i > 0)
        n = n.multiply(BigInteger.valueOf(i));
    return n;
}