Упростить радикал в квадратичной формуле? - PullRequest
1 голос
/ 07 марта 2012

Я довольно новичок в Java, и мне нужна помощь в написании кода, который упростит квадратную формулу. Прямо сейчас моя программа усекает два решения до двух десятичных знаков. Но я не знаю, как упростить квадрат дискриминанта. Например, если дискриминант равен 8, то я бы хотел, чтобы программа выводила 2√2. Можете ли вы предоставить мне код, необходимый для этого?

package quadraticprogram;

//This imports the DecimalFormat class, Scanner class, and all other Java classes.
import java.text.DecimalFormat;
import java.util.Scanner;
import java.util.*;

public class QuadraticProgram {

  public static void main(String[] args) {
    int a, A;

    Scanner scan = new Scanner (System.in);
    System.out.println ("Use integer value, enter minimum value of a:");
    a = scan.nextInt();

    System.out.println ("Use integer value, enter maximum value of A:");
    A = scan.nextInt();
    Random generator = new Random();

    // Generate random integers in the range from a to A
    // and assign them to numa, numb, and numc
    double numa = generator.nextInt(A - a + 1) + a;
    double numb = generator.nextInt(A - a + 1) + a;
    double numc = generator.nextInt(A - a + 1) + a;

    System.out.println ("numa" + numa);
    System.out.println ("numb" + numb);
    System.out.println ("numc" + numc);

    // Define d as the discriminant and take its square root
    double d;
    d = ((numb*numb)-(4*numa*numc));
    double r = Math.sqrt(d);

    // Calculate the two solutions
    double s = ((-numb + r)/(2*numa));
    double S = ((-numb - r)/(2*numa));

    // Truncate the two solutions to two decimal places.
    DecimalFormat fmt = new DecimalFormat ("0.##");

    // If the discriminant is negative there are no real solutions.
    if (d<0) {
      System.out.println("No Real Solutions");
    } else  {
    // Print both solutions if the discriminant is not negative
      System.out.print(fmt.format(s));
      System.out.println("," + fmt.format(S));
    }
  }
}

Прямо сейчас в программе пользователь вводит минимальное целое число a и максимальное целое число A. Затем генерируются случайные двойные значения numa, numb и numc, которые находятся между a и A. Затем программа вычисляет дискриминант, д, как двойной. Затем берется квадратный корень d, который является r. Затем программа заканчивает вычисление двух решений s и S. Затем программа печатает два решения, если дискриминант не меньше 0, и усекает их до двух десятичных разрядов.

Ответы [ 5 ]

4 голосов
/ 07 марта 2012

Основной алгоритм довольно прост:

  1. Фактор число в дискриминанте
  2. Возьмите факторы, которые появляются дважды из радикала

Вотпример:

sqrt(180) = sqrt(2*2*3*3*5) = 2*3*sqrt(5) = 6*sqrt(5)

Обратите внимание, что это не будет работать, если дискриминант не является целочисленным.

0 голосов
/ 28 февраля 2016

Я по сути создал функцию для нахождения квадратного множителя квадратного корня и использовал ее для всего остального.

public static double sqFactor(double num) {
    double sqInt = 1;
    double lastInt=1;
    for (int i=2; i<=num;) {
        if (num%i==0) {
            num /= i;


            if (i==lastInt) {
                sqInt *= i;
                lastInt=1;
                i=1;
            }
            else lastInt=i;
            i=1;

        }

        i++;

    }
    return sqInt;
}

    public static void main(String[] args)  {

        Scanner scan = new Scanner (System.in);

        System.out.println("a =");
        double a = scan.nextDouble();

        System.out.println("b =");
        double b = scan.nextDouble();

        System.out.println("c =");
        double c = scan.nextDouble();

        double d = Math.pow(b, 2) -(4 * a * c);
        if (d<0) {
        d *= -1;
        System.out.println("Your roots are " + -b +" +- " + sqFactor(d) +"i sqrt" + d/sqFactor(d) );
        }
        else {
        double root1 = (-b + Math.sqrt(d)) / (2 * a);
        double root2 = (-b - Math.sqrt(d)) / (2 * a);

        System.out.println("Your first root value is " + root1);
        System.out.println("Your second root value is " + root2);
        }



    }
0 голосов
/ 28 ноября 2013

Лично я думаю, что это был бы самый простой способ получить правильные ответы с наименьшим количеством кода:

import javax.swing.JOptionPane;
public class ShortABC 
{
    public static void main(String[] args) 
    {
    float a = Float.parseFloat(JOptionPane.showInputDialog(null, "Please, give in variable a", "Input variable A", JOptionPane.QUESTION_MESSAGE)), b = Float.parseFloat(JOptionPane.showInputDialog(null, "Please, give in variable b", "Input b", JOptionPane.QUESTION_MESSAGE)), c = Float.parseFloat(JOptionPane.showInputDialog(null, "Please, give in variable c", "Input c", JOptionPane.QUESTION_MESSAGE)), D = (float) (Math.pow(b, 2) - (4 * a * c)), x1 = (float) ((-b - Math.sqrt(D)/(2*a))), x2 = (float) ((-b + Math.sqrt(D)/(2*a)));//Input for all variables.
    if(D < 0) JOptionPane.showMessageDialog(null,"No answers possible");//Output for answer(s). else if(D == 0) 
    else if(D == 0) JOptionPane.showMessageDialog(null,"One possible answer: " + x1);//Output for answer(s).
    else if(D > 0) JOptionPane.showMessageDialog(null, "Two possible answers: " + x1 + " en " + x2);//Output for answer(s).
    }
}

Хотя я бы не знал, как печатать ответы в spuareroots.Удачи с этим.Надеюсь, это поможет.

0 голосов
/ 21 марта 2013

1.Не уверен, что вы сделали, но вот мое решение.

import java.util.Scanner;
public class quadform {

    public static void main(String[] args) {
    double a,b,c;

    Scanner takea = new Scanner(System.in);
    System.out.println("Enter variable a");
    double inputa = takea.nextDouble();

    Scanner takeb = new Scanner(System.in);
    System.out.println("Enter variable b");
    double inputb = takeb.nextDouble();

    Scanner takec = new Scanner(System.in);
    System.out.println("Enter variable c");
    double inputc = takec.nextDouble();


    a = inputa;
    b = inputb;
    c = inputc;


    double rootone,roottwo;
    double discriminant;
    double thefirstpart,thesecondpart;
    thefirstpart = Math.pow(b,2);
    thesecondpart =4 *a *c;
    discriminant = Math.sqrt(thefirstpart - thesecondpart);
    rootone = (-(b)+ discriminant)/(2 *(a)); 
    roottwo = (-(b)- discriminant)/(2 *(a));

    System.out.println("The first root (+) is: " + rootone);
    System.out.println("The second root(-) is: " + roottwo);




    }

}
0 голосов
/ 07 марта 2012

Предположим, я понял, что ваша цель состояла в том, чтобы напечатать квадратный корень описателя в упрощенной форме, это должно сработать (я использовал? Вместо символа sqrt, который у меня нет времени, чтобы посмотреть, как распечатать):

     while(d%Math.pow(f, 2)!=0&&f>1){
        f--;
    }

    if(f>1&&d/Math.pow(f, 2)!=1){
        System.out.println(f+"?"+d/Math.pow(f, 2));
    }else{
        System.out.println(Math.sqrt(d));
    }

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...