【问题标题】:Java program to find integer root of a quadratic equationJava程序查找二次方程的整数根
【发布时间】:2018-08-29 08:05:29
【问题描述】:

所以,这是我的要求。如果一个二次方程有两个根(一个整数和一个浮点数),我只想取整数值进行进一步操作。我无法弄清楚它是如何制作的。谁能告诉我。 (Java 会更好)。

【问题讨论】:

  • 您尝试了什么,遇到了什么问题?有很多方法可以测试一个数字是否为整数。我喜欢x == (long) xx == Math.round(x)
  • 这是我被问到的问题。你的任务是建造一座由 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 =如果存在这样的 n,则为 m;如果不存在这样的 n,则为 -1。
  • 总是在询问时分享您的代码。这对我来说似乎是家庭作业。无论如何,我会给你一个提示,只需检查数字的整数部分是否等于数字..如果是,那么它是一个整数,否则是一个浮点数
  • 感谢您的提示
  • 我会使用一个循环来求和 1^3 + 2^3 等,直到你有一个匹配的值或一个太大。您不需要解根或使用浮点数。

标签: java floating-point int root quadratic


【解决方案1】:

[我不经常使用 Java。这是一个使用 C 的解决方案。由于只使用了基本概念,Java 从业者应该能够很容易地翻译它。]

在网上搜索“立方和”会发现this page,它告诉我们 k3 的总和对于 k 从 1 到nn2•(n+1)2/4。

这是一个四次方程,其闭式解是已知的,但我们很容易看到,对于正 nn2•(n+1)2/4 介于 n4/4 和 (n +1)4/4。那么,如果 m 是前 n 个立方体的总和,则 n = floor((4•m) 1/4)。因此,如果我们有一个pow 实现,它使用最近舍入忠实地舍入(计算结果是最接近数学结果的两个可表示值之一),我们可以找到 n 和 @ 987654324@。如果pow 没有如实四舍五入,那么round(pow(4*m, .25)) 将服务于pow 为其返回一些合理结果而没有太多错误的域。 (round 之所以有效,是因为 (4•m)1/4 不会超过 n ½ 以上。尽管Wolfram Alpha shows us the limit as n goes to ∞ is ½ 已省略证明, 并且多余是单调的。)

因此,如果 m 是前 n 个立方体的总和,则 nround(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。 查找NB(250500249999)->-1。 找到Nb(250500250000)-> 1000。 查找NB(250500250001)->-1。

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

【讨论】:

    【解决方案2】:

    使用基本的二次公式求根。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-31
      • 2021-11-18
      • 1970-01-01
      • 2011-10-05
      • 2018-01-08
      相关资源
      最近更新 更多