Java欧拉数结果无穷大
Java Euler number result infinity
我尝试使用递归函数来计算Java中的欧拉数。当我在这个公式中输入小数字时没问题:
但是当我尝试输入更大的数字(例如 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
您尝试将其存储在一个长值中,但是长的
max 值远小于 1000!
。基本装不下了
考虑使用class BigInteger (or BigDecimal),它在默认的java sdk中,您可以直接通过println()
输出。
但是您已经知道结果,它是 e,因此您可能只需要为阶乘实现 Big-Class
。
您超出了 long 的容量。但我建议您决定 e.
需要多少精度
假设您希望它的误差小于 .0000001
。继续 e 的迭代,直到您最近的计算与之前的计算之间的正增量小于或等于您的错误。
如果您想将其发挥到极致,可以随时使用 BigDecimal
来提高结果的准确性。
我使用循环解决了这个问题。对于旧算法,我将事实方法类型更改为 double。我摆脱了无限。之后,我面临“WhosebugError”。
What is a WhosebugError?
我的新算法是;
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);
}
}
即使我在耐心等待后输入大数字,我也能毫无例外地得到结果。
我尝试使用递归函数来计算Java中的欧拉数。当我在这个公式中输入小数字时没问题:
但是当我尝试输入更大的数字(例如 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
您尝试将其存储在一个长值中,但是长的
max 值远小于 1000!
。基本装不下了
考虑使用class BigInteger (or BigDecimal),它在默认的java sdk中,您可以直接通过println()
输出。
但是您已经知道结果,它是 e,因此您可能只需要为阶乘实现 Big-Class
。
您超出了 long 的容量。但我建议您决定 e.
需要多少精度假设您希望它的误差小于 .0000001
。继续 e 的迭代,直到您最近的计算与之前的计算之间的正增量小于或等于您的错误。
如果您想将其发挥到极致,可以随时使用 BigDecimal
来提高结果的准确性。
我使用循环解决了这个问题。对于旧算法,我将事实方法类型更改为 double。我摆脱了无限。之后,我面临“WhosebugError”。 What is a WhosebugError?
我的新算法是;
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);
}
}
即使我在耐心等待后输入大数字,我也能毫无例外地得到结果。