我是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转换成全数字的方法?
答案 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;
}