微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java欧拉数结果无穷大

如何解决Java欧拉数结果无穷大

我尝试使用递归函数来计算 Java 中的欧拉数。当我在这个公式中输入小数字时就可以了:

enter image description here

但是当我尝试输入更大的数字(例如 1000)时,我会得到无穷大。 为什么会这样。我该如何解决

import java.util.Scanner;

public class enumber {
    public static long fact(int a) {
         if(a <= 1) {
             return 1;
         }
         return a * fact(a - 1);
    }

    public static double calculate(int i) {
        double cresult = Math.pow(fact(i),-1);
        if(i == 0 ) {
            return 1;
        }
        return cresult+calculate(i-1);
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(system.in);  
        System.out.println("Enter i value: ");
        int i = sc.nextInt();
        double eresult = calculate(i);
        System.out.println(eresult);
    }
}
 

输出

    Enter i value: 
    1000
    Infinity

解决方法

那是因为您尝试计算 1000 的阶乘......这是非常大的。 Factorial 1000

您尝试将其存储在 long 值中,但是 long 的 max 值远小于 1000!。基本上不适合了。

考虑使用类BigInteger(或BigDecimal),它在默认的java sdk中,您可以通过println()直接输出。

但是您已经知道结果,它的 e,因此您可能只需要为阶乘实现 Big-Class

,

你超出了一个长的容量。但我建议您决定 e 所需的精度。

假设您希望它的误差小于 .0000001。继续对 e 进行迭代,直到最新计算与前一个计算之间的正增量小于或等于您的误差。

如果您想将其发挥到极致,您可以随时使用 BigDecimal 来提高结果的准确性。

,

我通过使用循环解决了这个问题。对于旧算法,我将事实方法类型更改为 double。我摆脱了无限。之后,我面临“StackOverflowError”。 What is a StackOverflowError?

我的新算法是;

import java.util.Scanner;

public class enumber2 {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        double fact;
        double eNumber = 0;
        int i = in.nextInt();
        
        while(i>0) {
            fact=1;
            for(int j=1; j<=i; j++) {
                fact = fact * j;
            }
            eNumber = eNumber +(1.0/fact);
            i--;
        }
        eNumber = eNumber +1;
        System.out.println(eNumber);
    }

}

即使我在耐心一点后输入大数字,我也无一例外地得到了结果。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。