Неправильное построение кубов
Задача: построить здание, в котором будет куча из n кубов. Куб внизу будет иметь объем n ^ 3, куб выше будет иметь объем (n-1) ^ 3 и так далее до тех пор, пока верх не будет иметь объем 1 ^ 3.
Вам дан общий объем здания. Получив m, вы можете найти количество n кубов, которые вам нужно будет построить?
Параметр функции findNb (find_nb, find-nb, findNb) будет целым числом m, и вы должны вернуть целое число n, например n ^ 3 + (n-1) ^ 3 + ... + 1 ^ 3 = m, если такой существует, или -1, если такого нет.
Проблема: у меня не проходит два теста, вот код:
public static long findNb(long M) {
long m = 0;
long i = 0;
while (m < M) {
m += Math.pow(i, 3);
if (m == M) {
return i;
}
i += 1;
}
return -1;
}
Тесты, которые не проходит:
Первый:
expected:<55100> but was:<-1>
Второй:
Find n of : 2070953479852762176
expected:<53648> but was:<-1>
Ответы (1 шт):
Используйте умножение вместо Math.pow:
m += i*i*i;
pow возвращает double, а числа с плавающей точкой расчитываются с погрешностью, что и приводит к ошибке.
Вот первый шаг вычислений, который приводит к ошибке:
//сумма до 13776
long s = 9005246260992576L;
//номер следующего куба
long n = 13777;
//с Math.pow получается 9007861214521008
System.out.println((long) (s+Math.pow(13777, 3)));
//с умножением 9007861214521009
System.out.println(s+n*n*n);