如何在java中计算和显示大数

如何在java中计算和显示大数,java,Java,如何计算和显示像9999这样的大数字的所有数字(9999的阶乘) 看看这个计算9999并显示所有数字。使用BigInteger,他的限制是你的内存 public static BigInteger factorial(BigInteger num) { if (num.compareTo(new BigInteger("1")) < 0) { return new BigInteger("1"); } else { return factor

如何计算和显示像
9999这样的大数字的所有数字(9999的阶乘)


看看这个计算
9999并显示所有数字。

使用BigInteger,他的限制是你的内存

public static BigInteger factorial(BigInteger num) {
    if (num.compareTo(new BigInteger("1")) < 0) {
        return new BigInteger("1");
    } else {
        return factorial(num.subtract(new BigInteger("1"))).multiply(num) ;
    }
}
公共静态biginger阶乘(biginger num){
if(num.compareTo(新的BigInteger(“1”))<0){
返回新的BigInteger(“1”);
}否则{
返回阶乘(num.subtract(新的BigInteger(“1”))。乘法(num);
}
}

Java标准库提供了一个
BigInteger
类,它可以表示无限的整数值(实际上,它们是有限的,但仅限于可用内存)。

您可以使用字符串(是的,不要惊讶,您可以!)。可以在字符串中创建一个程序,将两个非常大的数字相乘(这里我说的是长度为5000位的数字!) 我已经为加法和减法创建了它们,为乘法创建它们并不难,我向您保证,尽管您会认为使用biginger会更快,但与BigInt相比,使用字符串会更快


还有一件事让我半途而废,我使用了StringBuilder类来提高程序的效率

使用biginger;9999! 用Java8花了120毫秒。下面是一个使用long和half的版本:

public static BigInteger factorial(int n) {
    // Try first to use longs in calculating the factorial.

    BigInteger result = BigInteger.ONE;
    long factor = 1;
    for (int i = n; i > 1; --i) {
        if Long.MAX_VALUE / factor < i) { // Overflow?
            result = result.multiply(BigInteger.valueOf(factor));
            factor = i;
        } else {
            factor *= i;
        }
    }
    return result.multiply(BigInteger.valueOf(factor));
}
publicstaticbiginger阶乘(intn){
//首先尝试在计算阶乘时使用long。
BigInteger结果=BigInteger.ONE;
长因子=1;
对于(int i=n;i>1;--i){
如果Long.MAX_值/因子
不是最快的,但也不是很慢

public static BigInteger factorial(int n) {
    BigInteger result = BigInteger.ONE;
    for (int i = 2; i <= n; i++) {
        result = result.multiply(BigInteger.valueOf(i));
    }
    return result;
}
publicstaticbiginger阶乘(intn){
BigInteger结果=BigInteger.ONE;

对于(int i=2;i@JoopEggen biginger是超慢的!:)@SarthakMittal但不是次优编码的。或者使用您的处理器:Java 8有一些不错的并发选项(IntStream并行),或使用GPU编写,进行数组处理。@JoopEggen实际上我在这里尝试提升字符串,我在字符串和BigInt中制作了这样的程序,它们的执行时间相差很大!@SarthakMittal你有没有使用字符串计算阶乘的例子?我明白了,尽管字符串像bigtinteger一样是不可变的oo?您是首先使用
StringBuilder
还是
char[]
?哈哈,是的,你完全理解了我的意思,我使用了StringBuilder:),抱歉没有提及,只是忘记了,让我编辑我的答案,这样人们就不会被误导:)@weston也许你可以在互联网上找到它,告诉你真相,我帮助我的一个朋友创建了一个程序,可以将两个大数字相乘仅使用字符串,但最初是他的代码,因此发布该代码违反了我的道德规范:)还有另一个限制。调用堆栈。
factorial(9999)
意味着9999个堆栈帧。我没有尝试过,这取决于堆栈大小,但这太多了,而且容易发生
StackOverflow
。解决方案是尾部递归的,很容易切换到循环。没有
StackOverflow
的好解决方案例外哦,溢出无法通过
因子*I 31)进行测试{
不幸的是成本更高。
如果(Long.MAX_值/系数
可能是一个更具可读性的溢出测试。我有一个理论,我无法正确地工作,如果你交替使用一个高的然后是一个低的数字,你会减少溢出的数量,从而减少BigInteger的总数。我认为交替的逻辑比增益慢。1984乘以2120。