Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском.
Закрыт 2 года назад.
Ошибка во времени исполнения кода. Код, может, и кривой, но крашиться, по-идее, не должен. Прошу помочь кто может.
Вот задание:
Your task is to construct a building which will be a pile of n cubes. The cube at the bottom will have a volume of n^3, the cube above will have volume of (n-1)^3 and so on until the top which will have a volume of 1^3. You are given the total volume m of the building. Being given m can you find the number n of cubes you will have to build? The parameter of the function findNb (find_nb, find-nb, findNb) will be an integer m and you have to return the integer n such as n^3 + (n-1)^3 + ... + 1^3 = m if such a n exists or -1 if there is no such n.
Вот код:
public class ASum {
public static long findNb(long m) {
int n = 2;
int result = 0;
while(n<m)
{
result = 0;
for(int i = 1; i <= n; i++)
{
result += i*i*i;
}
if(result == m) return n;
else n++;
}
return -1;
}
}
Вот ошибка:
Execution Timed Out (12000 ms)
P.S. Спасибо за ответы. Но вопрос именно в том, почему этот код - неверный, а не какой код лучше. Пожалуйста, кто знает, - ответьте
Я решу эту задачу за 0 циклов.
public static long findNb(long m) {
long root = Convert.ToInt64(Math.Sqrt(m));
if (root * root != m) // не является суммой кубов последовательных чисел
{
return -1;
}
long d = 1 + 8*root;
long n = (-1 + Math.Sqrt(d)) / 2;
if (Math.Pow(0.5 * n * (n+1), 2) != m)
{
return -1;
}
return n;
}
PS. На с# пишу впервые в жизни, возможно наврал с квадратным корнем и переводом double в long.
Пояснение
Сумма кубов числового ряда от 1 до n равна (0.5 * n * (n+1)) ^ 2. Поэтому в первой строчке беру целую часть квадратного корня из m
и потом проверяю, равен ли квадрат этого корня числу m
. Если нет, то входное число не является суммой кубов.
Дальше просто решаю квадратное уравнение, выведенное из первой формулы:
(0.5 * n * (n+1)) ^ 2 = m
-> n^2 + n - 2*m = 0
PPS. Сейчас собразил, что если m
будет квадрат, который не является суммой кубов (например, 49), то функция выдаст неверный результат. Так что нужно добавить еще одну проверку:
if (Math.Pow(0.5 * n * (n+1), 2) != m)
{
return -1;
}
Но теперь надо ещё специально обрабатывать ситуацию m = 0.
Я знаю - отвечаю.
Ваш код неправильный, потому что Вы сравниваете "яблоки" с "апельсинами". Здесь
while(n<m)
m
- общее число маленьких кубиков в здании, а n
- количество кубов, представляющих собой ступени в этом "мавзолее".
long result = 0;
for (int i = 1; result < m; i++)
{
result += i*i*i;
if (result == m)
return i;
}
return -1;
Без никакого двойного цикла.
function findCubes(m) {
var result = 0;
for (var i = 1; result < m; i++) {
result += i * i * i;
if (result == m)
return i;
}
console.log(i, result);
return -1;
}
console.log(findCubes(1 + 8 + 27 + 64 + 125 + 6 * 6 * 6 + 7 * 7 * 7));
console.log(findCubes(1000000000000));
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
вопрос на счёт аудио файлов и их воспроизведенияСейчас делаю не большую игру в windows forms
Есть у меня веб-приложение, в котором соединено два очень разнородных api, скажем:
Не смогла найти в интернете адекватного объяснения работы с DataTable для изменения записейЕсли у кого-то есть ссылки на источники, буду очень...
Выдаёт ошибку Fatal error: Uncaught Error: Call to a member function bindValue() on bool in… Не пойму, в чём может быть проблемаВывод var_dump($req); — bool(false)