我尝试使用for循环和双数据类型来找到大量如8785856的阶乘的典型方式。
但它显示无穷大的结果,可能是因为它超出了极限。
所以,请指引我找到一个非常大的数的阶乘的方式。
我的代码:
class abc
{
public static void main (String[]args)
{
double fact=1;
for(int i=1;i<=8785856;i++)
{
fact=fact*i;
}
System.out.println(fact);
}
}
输出: -
Infinity
我是新来的Java,但学到的IO处理和所有的一些概念。
public static void main(String[] args) {
BigInteger fact = BigInteger.valueOf(1);
for (int i = 1; i <= 8785856; i++)
fact = fact.multiply(BigInteger.valueOf(i));
System.out.println(fact);
}
你可能要重新计算这一巨大的价值。 Wolfram Alpha的的逼近表明,它肯定会不适合在主内存中显示。
此代码应该很好地工作: -
public class BigMath {
public static String factorial(int n) {
return factorial(n, 300);
}
private static String factorial(int n, int maxSize) {
int res[] = new int[maxSize];
res[0] = 1; // Initialize result
int res_size = 1;
// Apply simple factorial formula n! = 1 * 2 * 3 * 4... * n
for (int x = 2; x <= n; x++) {
res_size = multiply(x, res, res_size);
}
StringBuffer buff = new StringBuffer();
for (int i = res_size - 1; i >= 0; i--) {
buff.append(res[i]);
}
return buff.toString();
}
/**
* This function multiplies x with the number represented by res[]. res_size
* is size of res[] or number of digits in the number represented by res[].
* This function uses simple school mathematics for multiplication.
*
* This function may value of res_size and returns the new value of res_size.
*/
private static int multiply(int x, int res[], int res_size) {
int carry = 0; // Initialize carry.
// One by one multiply n with individual digits of res[].
for (int i = 0; i < res_size; i++) {
int prod = res[i] * x + carry;
res[i] = prod % 10; // Store last digit of 'prod' in res[]
carry = prod / 10; // Put rest in carry
}
// Put carry in res and increase result size.
while (carry != 0) {
res[res_size] = carry % 10;
carry = carry / 10;
res_size++;
}
return res_size;
}
/** Driver method. */
public static void main(String[] args) {
int n = 100;
System.out.printf("Factorial %d = %s%n", n, factorial(n));
}
}
提示:使用BigInteger
类,并准备给JVM大量的内存。 值8785856!
是一个非常大的数字。
使用类BigInteger
。 (我不知道是否会即使如此巨大的整数工作)
本博客文章解释了与Java的例子阶乘的BigInteger。
Infinity
是在一个特殊的保留值Double
,当你有超过一个的最大数量的一类double
能容纳。
如果你希望你的代码工作,使用BigDecimal
类,但考虑到输入数字,不要指望你的程序尽快完成执行的时候。
如果不是天使用的BigInteger您的问题(8785856!)上述解决方案会从字面上采取的CPU小时的时间。 你需要确切的结果或将逼近足够?
有所谓的“数学方法英镑逼近 ”,它可以简单快速地计算了,下面是高斯帕的改进:
import java.util.*;
import java.math.*;
class main
{
public static void main(String args[])
{
Scanner sc= new Scanner(System.in);
int i;
int n=sc.nextInt();
BigInteger fact = BigInteger.valueOf(1);
for ( i = 1; i <= n; i++)
{
fact = fact.multiply(BigInteger.valueOf(i));
}
System.out.println(fact);
}
}
试试这个:
import java.math.BigInteger;
public class LargeFactorial
{
public static void main(String[] args)
{
int n = 50;
}
public static BigInteger factorial(int n)
{
BigInteger result = BigInteger.ONE;
for (int i = 1; i <= n; i++)
result = result.multiply(new BigInteger(i + ""));
return result;
}
}
Scanner r = new Scanner(System.in);
System.out.print("Input Number : ");
int num = r.nextInt();
int ans = 1;
if (num <= 0) {
ans = 0;
}
while (num > 0) {
System.out.println(num + " x ");
ans *= num--;
}
System.out.println("\b\b=" + ans);
要真正摸清这个数字,你应该使用Python的功能,并尝试打开任务管理器,看看编译器多少内存占用的阶乘。 之后,你就会知道,有多少时间JVM是要采取,因为Python是数值计算的最佳语言。
import java.util.Scanner;
public class factorial {
public static void main(String[] args) {
System.out.println("Enter the number : ");
Scanner s=new Scanner(System.in);
int n=s.nextInt();
factorial f=new factorial();
int result=f.fact(n);
System.out.println("factorial of "+n+" is "+result);
}
int fact(int a)
{
if(a==1)
return 1;
else
return a*fact(a-1);
}
}