在Java中查找数字的位数之和

时间:2018-04-05 20:56:30

标签: java

我是Java新手,我想出了一个欧拉问题的解决方案

public class Problem16{

    public static void main(String[] args){
        System.out.println(DecomposeNumber(PowerDigitSum(1000)));
    }// end main

    public static double PowerDigitSum(double iExposant){
        return Math.pow(2, iExposant);
    }// end PowerDigitSum()

    public static int DecomposeNumber(double iNb){
        int[] intTab = String.valueOf(iNb).chars().map(Character::getNumericValue).toArray();
        int iMax = intTab.length;
        int sum = 0;
            for(int i = 0; i < iMax; i++){
                sum += intTab[i];
            }
            return sum + 1;
    }// end DecomposeNumber()

}// end classe

我不明白的是我的解决方案适用于小数字,例如n ^ 15但不是n ^ 1000,例如,我知道它不起作用,因为数字不是一整套数字但是在那里将1.071509e + 301转换成全数字的方法?

3 个答案:

答案 0 :(得分:2)

如果我的问题正确,你想要打印一个没有科学记数的大双。你可以使用String.format()

来做到这一点
String stringNumber = String.format("%f", iNb);

答案 1 :(得分:2)

虽然另一个答案肯定解决了你问题的一部分。我建议不要将double类型用于2 ^ 1000

的计算

您的问题的答案是使用BigInteger。作为提示,我将提供PowerDigitSum方法的逻辑,我将把剩下的逻辑留作练习,因为你正试图从中学习。

函数PowerDigitSum现在变为:

public static BigInteger powerDigitSum(int exponent){
      return BigInteger.TWO.pow(exponent); // 2 ^ exponent
}

注意,如果您要继续使用此方法(我希望您这样做),那么在map方法内的流管道中调用DecomposeNumber之后,您只需调用{ {1}}并返回结果而不是.sum(),这意味着您不需要执行后续循环来对数字求和。

答案 2 :(得分:0)

这是使用BigInteger的实现,没有字符串转换。事实证明,大型double值的模数并不比字符串方法好。

请注意,这实际上是字符串转换的基础,没有在这种情况下不需要的开销。

int sumDigits(BigInteger number) {
    int sum = 0;

    while (number.compareTo(BigInteger.ZERO) > 0) {
        sum += number.mod(BigInteger.TEN).intValue();
        number = number.divide(BigInteger.TEN);
    }

    return sum;
}