Программа на Java для нахождения целочисленного корня квадратного уравнения

Итак, вот мое требование. Если квадратное уравнение имеет два корня (int и float), я хочу использовать только целочисленное значение для дальнейших манипуляций. Я не могу понять, как это сделано. Кто-нибудь может мне сказать, пожалуйста. (Ява лучше бы).

что вы пробовали и с чем у вас проблемы? Есть много способов проверить, является ли число целым. Мне нравится x == (long) x или x == Math.round(x)

Peter Lawrey 29.08.2018 10:07

Это вопрос, который мне задали. Ваша задача построить здание, которое будет представлять собой груду из n кубиков. Куб внизу будет иметь объем n ^ 3, куб выше будет иметь объем (n-1) ^ 3 и так далее до вершины, которая будет иметь объем 1 ^ 3. Вам дан общий объем здания m. Получив m, сможете ли вы найти количество n кубиков, которое вам нужно будет построить? Параметр функции findNb (find_nb, find-nb, findNb) будет целым числом m, и вы должны вернуть целое число n, такое как n ^ 3 + (n-1) ^ 3 + ... + 1 ^ 3 = m, если такой существует, или -1, если такого n нет.

Harsha Bharadwaz 29.08.2018 10:10

Всегда делитесь своим кодом, когда спрашиваете. Мне это кажется домашней работой. В любом случае я дам вам подсказку, просто проверьте, равна ли целая часть числа числу ... если это так, то это целое число, иначе плавающее число

Sid 29.08.2018 10:10

Спасибо за подсказку

Harsha Bharadwaz 29.08.2018 10:12

Я бы использовал цикл для суммирования 1 ^ 3 + 2 ^ 3 и т. д., Пока у вас не будет совпадающего значения или слишком большого. Вам не нужно решать корни или использовать float.

Peter Lawrey 29.08.2018 10:14

В постановке задачи или непосредственно при ее решении квадратного уравнения нет.

Eric Postpischil 29.08.2018 13:24
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
6
314
2

Ответы 2

[Я не использую Java регулярно. Вот решение, использующее C. Поскольку используются только элементарные концепции, специалист по Java должен уметь легко их перевести.]

Поиск в Интернете «суммы кубов» обнаруживает эта страница, который сообщает нам, что сумма k3 для k от 1 до п равна п2 • (п + 1) 2 / 4.

Это уравнение четвертой степени, для которого известны решения в замкнутой форме, но мы легко видим, что для положительного п, п2 • (п + 1) 2 / 4 находится между п4 / 4 и (п + 1) 4. Затем, если мм> является суммой первых кубов п, п = floor ((4 • мм>) 1/4). Итак, если у нас есть реализация pow, которая точно округлена с использованием метода округления до ближайшего (вычисленный результат - одно из двух представимых значений, ближайших к математическому результату), мы можем найти п с floor(pow(4*m, .25)). Если pow не округлен правильно, то round(pow(4*m, .25)) будет обслуживать домен, для которого pow возвращает некоторый разумный результат без особых ошибок. (round работает, потому что (4 • мм>) 1/4 никогда не превышает п более чем на 1/2. Доказательство опущено, хотя Wolfram Alpha показывает нам, что предел, когда п переходит в ∞, составляет ½, и превышение монотонно.)

Таким образом, если мм> является суммой первых кубов п, то п является результатом round(pow(4*m, .25)). Таким образом, мы можем вычислить это значение для п, затем вычислить сумму первых кубов п как n*n*(n+1)*(n+1)/4 и проверить, равно ли оно мм>. Если это так, мы нашли решение и возвращаем его. Если это не так, мм> не является суммой кубиков, и мы возвращаем −1:

#include <math.h>
#include <stdio.h>

static double findNb(double m)
{
    double n = round(pow(4*m, .25));
    double sum = n * n * (n+1) * (n+1) / 4;
    return m == sum ? n : -1;
}

static void Test(double m)
{
    printf("findNb(%.99g) -> %.99g.\n", m, findNb(m));
}

int main(void)
{
    Test(0);
    Test(1);
    Test(2);
    Test(8);
    Test(9);
    Test(10);
    Test(250500249999.);
    Test(250500250000.);
    Test(250500250001.);
}

Выход:

findNb(0) -> 0.
findNb(1) -> 1.
findNb(2) -> -1.
findNb(8) -> -1.
findNb(9) -> 2.
findNb(10) -> -1.
findNb(250500249999) -> -1.
findNb(250500250000) -> 1000.
findNb(250500250001) -> -1.

Конечно, ограничения точности с плавающей запятой приведут к сбою этого кода, если мм> больше, чем может быть представлено в double.

Чтобы найти корни, используйте основную квадратичную формулу.

Установите корни на разные значения (оба двойные)

Используйте modulous (%) на 1 и приведите значение к двойному. Если вычисленное значение double! = 0, то это не int.

Другие вопросы по теме