Java程序来查找二次方程的整数根

时间:2018-08-29 08:05:29

标签: java floating-point int root quadratic

所以,这是我的要求。如果二次方程式有两个根(int和浮点数),我想只取整数值以进行进一步处理。我不知道是怎么做的。谁能告诉我。 (Java会更好)。

2 个答案:

答案 0 :(得分:0)

[我不经常使用Java。这是一个使用C的解决方案。由于仅使用基本概念,因此Java从业者应该能够轻松地对其进行翻译。]

在网络上搜索“立方和”会显示this page,它告诉我们 k k 3 的总和1到 n n 2 •( n +1) 2 / 4

这是一个四次方程,已知闭式解,但是对于正数 n n 2 •( n +1) 2 / 4在 n 4 / 4和( n +1) 4 / 4。然后,如果 m 是第一个 n 个立方体的总和,则 n = floor((4• m 1/4 )。因此,如果我们有一个pow实现,并且使用最近舍入法进行了舍入(计算结果是最接近数学结果的两个可表示值之一),则可以找到 n floor(pow(4*m, .25))。如果pow未如实四舍五入,则round(pow(4*m, .25))将在pow返回合理结果而没有太多错误的域上服务。 (round之所以有效,是因为(4• m 1/4 永远不会超过 n ½以上。尽管{ {3}},多余的部分是单调的。)

因此,如果 m 是第一个 n 个立方体的总和,则 n round(pow(4*m, .25))的结果。因此,我们可以计算 n 的值,然后将第一个 n 个立方的总和计算为n*n*(n+1)*(n+1)/4并测试其是否等于 m 。如果可以,我们找到了解决方案并返回。如果不是,则 m 不是多维数据集的总和,我们返回−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.

当然,一旦 m 大于double中可以表示的范围,浮点精度的限制将导致此代码失败。

答案 1 :(得分:0)

使用基本二次方程式求根。

将根设置为不同的值(均为双精度)

使用1的模数(%),并将值转换为双精度。如果计算的double是!= 0,则它不是int。