2015-11-19 67 views
2

我最近完成了一个编程挑战,挑战我们获得2015的阶乘。在计算阶乘之后,您将总和中的所有数字(在本例中为BigInteger)进行求和。因子编程挑战混淆

完成后,我取得的结果是:23517

然而,当我提交给了教授他说正确的结果是:26532

我似乎无法找到问题根本。我已经交叉检查了多个来源,到目前为止,一切都似乎表明我是对的。任何人都可以找到我的代码出错的地方?

import java.math.BigInteger; 

class toymeister { 

    public static void main(String[] args){ 
     System.out.println("The sum is: " + SumOf(FactorialOf(2015))); 
    } 

    public static BigInteger FactorialOf(int x){ 
     BigInteger Answer, intConvert; 

     intConvert = new BigInteger("0"); 
     Answer = new BigInteger("1");  

     for(int i=1; i<=x;i++){ 
      intConvert = intConvert.valueOf(i); 
      Answer = Answer.multiply(intConvert); 
     } 

     System.out.println("The Factorial Of " + x + " is: " + Answer); 

     return Answer; 
    } 

    public static BigInteger SumOf(BigInteger y){ 
     BigInteger Sum = new BigInteger("0"); 

     while(y.compareTo(BigInteger.ZERO) > 0) { 
      Sum = Sum.add(y.mod(BigInteger.TEN)); 
      y = y.divide(BigInteger.TEN); 
     } 

     return Sum; 
    } 
} 
+5

首先,请按[Java命名约定(http://www.oracle.com/technetwork /java/codeconventions-135099.html):变量名称应该以小写字母开头... – Frakcool

+5

http://www.wolframalpha.com/input/?i=digitsum%28fact%282015%29%29因此23517是正确的 – 2015-11-19 18:27:35

+0

打开你的调试器朋友。 – csmckelvey

回答

7

答案23517 is correct。不过,你可以简化代码:

public static BigInteger factorialOf(int x) { 
    BigInteger answer = BigInteger.ONE; 
    for(int i = 1; i <= x; i++) { 
     answer = answer.multiply(BigInteger.valueOf(i)); 
    } 
    System.out.println("The Factorial Of " + x + " is: " + answer); 
    return answer; 
} 

public static int sumOf(BigInteger y) { 
    String digits = y.toString(); 
    int sum = 0; 
    for(int i = 0, n = digits.length(); i<n; i++) sum += digits.charAt(i)-'0'; 
    return sum; 
} 

,或者使用Java 8:

public static BigInteger factorialOf(int x) { 
    return IntStream.rangeClosed(1, x).mapToObj(BigInteger::valueOf) 
     .reduce(BigInteger::multiply).orElse(BigInteger.ONE); 
} 
public static int sumOf(BigInteger y) { 
    return y.toString().chars().map(i -> i-'0').sum(); 
} 
+0

我喜欢这样。 (+1)。我可能会''orElse(BigInteger.ONE)'得到'x == 0'的正确结果。 –

+0

感谢您使用替代方法来简化我的代码。我其实认为我的代码很简单! – Jaccob

+0

@保罗·博丁顿:好点 – Holger