Java:实现简单的等式

Ale*_*exT 2 java equations

我希望实现简单的等式:

i,j = -Q±√(Q 2 -4PR)/ 2P

为此,我有以下代码(注意:P = 10. Q = 7. R = 10):

    //Q*Q – 4PR = -351 mod 11 = -10 mod 11 = 1, ?1 = 1
    double test = Math.sqrt(modulo(((Q*Q) - ((4*P)*R))));

    // Works, but why *-10 needed?
    i = (int)(((-Q+test)/(P*2))*-10);    // i = 3
    j = (int)(((-Q-test)/(P*2))*-10);    // j = 4
Run Code Online (Sandbox Code Playgroud)

简单地说,测试采用等式的第一部分并将其修改为介于0和11之间的非零整数,然后写入i和j.i和j返回正确的数字,但由于某种原因,需要*-10才能使它们正确(我想要获得正确值的数字).

如果可能的话,我想找到一种更好的方法来执行上面的等式,因为我这样做的方式似乎是错误的,只是有效.我希望按照等式所暗示的方式来做,而不是破解它的工作.

Jon*_*eet 6

二次方程是更常用来表示a,bc.为了满足ax 2 + bx + c = 0,你得到(-b +/- sqrt(b^2-4ac))/ 2a作为答案.

我认为你的基本问题是你出于某种原因使用模数而不是取平方根.因子-10只是一个软件因素,恰好适用于您的测试用例.

你应该有这样的东西:

public static void findRoots(double a, double b, double c)
{
    if (b * b < 4 * a * c)
    {
        throw new IllegalArgumentException("Equation has no roots");
    }

    double tmp = Math.sqrt(b * b - 4 * a * c);
    double firstRoot = (-b + tmp) / (2 * a);
    double secondRoot = (-b - tmp) / (2 * a);
    System.out.println("Roots: " + firstRoot + ", " + secondRoot);
}
Run Code Online (Sandbox Code Playgroud)

编辑:你的modulo方法目前正在慢慢递归.试试这个:

public static int modulo(int x)
{
    return ((x % 11) + 11) % 11;
}
Run Code Online (Sandbox Code Playgroud)

基本上第一个的结果% 11将在[-10,10]的范围内 - 所以在添加另一个11并% 11 再次使用之后,它将是正确的.无需递归.

在那时,没有太多理由将它作为一个单独的方法,所以你可以使用:

public static void findRoots(double a, double b, double c)
{       
    int squareMod11 = (((b * b - 4 * a * c) % 11) + 11) % 11;
    double tmp = Math.sqrt(squareMod11);
    double firstRoot = (-b + tmp) / (2 * a);
    double secondRoot = (-b - tmp) / (2 * a);
    System.out.println("Roots: " + firstRoot + ", " + secondRoot);
}
Run Code Online (Sandbox Code Playgroud)