有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我是Java新手,我为一个Euler问题想出了一个解决方案

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) 个答案

  1. # 1 楼答案

    而另一个答案肯定解决了你的部分问题。我不建议将double类型用于2 ^ 1000这样的计算

    你的问题的答案是利用^{}。作为提示,我将提供PowerDigitSum方法的逻辑,剩下的逻辑将作为练习,您将尝试从中学习

    函数PowerDigitSum现在变成:

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

    注意,如果您打算继续使用这种方法(我希望您会这样做),那么在DecomposeNumber方法内的流管道中调用map之后,您可以简单地调用.sum()并返回结果而不是toArray(),这意味着您不需要执行后续的循环来求和数字

  2. # 2 楼答案

    如果我答对了你的问题,你想打印一个没有科学记数法的大双精度。您可以使用String.format()来实现这一点

    String stringNumber = String.format("%f", iNb);
    
  3. # 3 楼答案

    下面是一个使用BigInteger和无字符串转换的实现。事实证明,大双精度值的模并不比字符串方法好

    请注意,这实际上是字符串转换的基础,没有本例中不需要的开销

    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;
    }