-2
Sum(N) =1^1+2^2+3^3+...+N^N

使用Java,我将如何BigInteger找到最小整数N,使得Sum(N) 的值大于10 ^ 20?我真的卡住了,请给我一些建议

这是我到目前为止所拥有的:

import java.math.BigInteger;
public class PROJECTV1 {
    public static void main(String [] args) {
        BigInteger bResult= bigFunctionExample_2();
        System.out.println(" => result_got:"+ bResult);
        System.out.println(); //newline
    }// end_main 

    public static BigInteger bigFunctionExample_2() {
        BigInteger bSum = BigInteger.ZERO;
        BigInteger bTmp;
        String sSum;
        // BigInteger bResult =0;
        for (int i=1; ; i++) {
            bTmp = BigInteger.valueOf(i);
            bTmp = bTmp.pow(i); // i^i
            bSum = bSum.add(bTmp); // sum = i^i+ (i-1)^(i-1)+ ....
            sSum = bSum.toString();
            if ( sSum.length() >21) {
                System.out.println("i="+i +" bSum ="+bSum);
                break;
            }//
        }//end_for
        return bSum; // result
    } // end_bigFunctionExample_2
}
4

2 回答 2

0

查看您的代码,您有一行bTmp.pow(2). 这使您的系列中的数字平方,但您需要提高bTmp功率bTmp。Java 似乎不想将 aBigInteger作为参数pow,但您可以pow用另一个for循环替换。

此外,sSum.length() >30看起来只有当您的总和大于或等于 10 29时才会发生这种情况。您是否有理由每次通过循环将数字转换为字符串,而不是将数字与 10 20进行比较?也许您可以bSum > bMax在循环中放置类似作为测试条件的for内容,而不是将其留空并以break. 然后你可以新建一个BigInteger bMax并在代码开始时将其设置为 10 20

对于测试,您可以设置bMax为较小的值,例如 100,然后查看您的程序是否给出了正确的结果。您可以手动计算该系列的前几个步骤来检查您的程序。

于 2014-11-24T22:23:47.460 回答
0

这是计算一些阶乘的线索:

import java.math.*;

public class FactorialBig {
    public static BigInteger factorial(BigInteger n) {
        if (n.equals(BigInteger.ZERO))
            return BigInteger.ONE;
        else
            return n.multiply(factorial(n.subtract(BigInteger.ONE)));
    }
    public static void main(String[] args) {
        for (int n = 0; n < 20; n++) {
            BigInteger f = factorial(new BigInteger(new Integer(n).toString()));
            System.out.printf("factorial(%2d) = %20s%n", n, f.toString());
        }
    }
}

您知道您应该将以上内容保存为名为“FacotrialBig.java”的文件。

于 2014-11-24T19:37:50.193 回答