Skip to content

Instantly share code, notes, and snippets.

@jarekt
Last active December 1, 2020 21:16
Show Gist options
  • Save jarekt/fd25c922100750a575f35664e3a5dbd7 to your computer and use it in GitHub Desktop.
Save jarekt/fd25c922100750a575f35664e3a5dbd7 to your computer and use it in GitHub Desktop.
A simple Quadratic equation solver capable of real number output both in the form of fractions and decimals
/**
* KvadratickaSranda
*/
public class KvadratickaSranda
{
public static void main(String[] args)
{
Fraction a = new Fraction();
Fraction b = new Fraction();
Fraction c = new Fraction();
try
{
a.parseFraction(args[0]);
b.parseFraction(args[1]);
c.parseFraction(args[2]);
}
catch (Exception e)
{
System.out.println("Expected parameters: a b c");
System.exit(1);
}
Fraction discriminant = new Fraction(b).multiply(b)
.subtract(new Fraction(4,1).multiply(a).multiply(c));
Fraction temp_1 = new Fraction(b).multiply(-1);//move
Fraction temp_2 = new Fraction(a).multiply(2);
double sqrt_result = Math.sqrt(discriminant.toDouble());
if (sqrt_result % 1 == 0)
{
Fraction x1 = new Fraction(temp_1).add((long)sqrt_result).divide(temp_2);
Fraction x2 = new Fraction(temp_1).subtract((long)sqrt_result).divide(temp_2);
System.out.printf("x1: %s approx: %f\n", x1.displayFraction(), x1.toDouble());
System.out.printf("x2: %s approx: %f\n", x2.displayFraction(), x2.toDouble());
}
else
{
double approx1 = (temp_1.toDouble() + sqrt_result) / temp_2.toDouble();
double approx2 = (temp_1.toDouble() - sqrt_result) / temp_2.toDouble();
System.out.printf("x: (%s +- sqrt(%s))/%s\n", temp_1.displayFraction(), discriminant.displayFraction(), temp_2.displayFraction());//could look a lot better with GUI or rendered in LaTeX
System.out.printf("x1: %f\n", approx1);
System.out.printf("x2: %f\n", approx2);
}
}
}
class Fraction
{
public long numerator;//myb hide
public long denominator;
Fraction(Fraction frac)
{
this.numerator = frac.numerator;
this.denominator = frac.denominator;
}
Fraction(long a, long b)
{
this.numerator = a;
this.denominator = b;
}
Fraction()
{
}
Fraction parseFraction(String s)//this could be very easily changed to parse fractions in the a/b format instead of double
{
try
{
final int nums_after_decimal = (s.split("\\."))[1].length();
this.denominator = (long) Math.pow(10,nums_after_decimal);
}
catch(Exception e)
{
this.denominator = 1;
}
this.numerator = (long) (Double.parseDouble(s) * this.denominator);
simplify();
return this;
}
double toDouble()
{
return ((double)this.numerator / (double)this.denominator);
}
private void simplify()
{
final long i_gcd = gcd(this.numerator, this.denominator);
this.numerator /= i_gcd;
this.denominator /= i_gcd;
if (this.denominator < 0)
{
this.numerator *= -1;
this.denominator *= -1;
}
}
String displayFraction()
{
if (this.denominator == 1)
{
return String.valueOf(this.numerator);
}
return String.join("/", String.valueOf(this.numerator), String.valueOf(this.denominator));
}
//
static long gcd(long a, long b)
{
if (b == 0)
{
return a;
}
return gcd(b, a % b);
}
static long lcm(long a, long b)
{
return ((a / gcd(a,b)) *b);
}
//Math operations
Fraction add(Fraction frac)
{
final long lcm = lcm(frac.denominator, this.denominator);
this.numerator = this.numerator * (lcm / this.denominator) + frac.numerator * (lcm / frac.denominator);
this.denominator = lcm;
this.simplify();
return this;
}
Fraction add(long a)
{
this.numerator += a * this.denominator;
this.simplify();
return this;
}
Fraction subtract(Fraction frac)
{
final long lcm = lcm(frac.denominator, this.denominator);
this.numerator = this.numerator * (lcm / this.denominator) - frac.numerator * (lcm / frac.denominator);
this.denominator = lcm;
this.simplify();
return this;
}
Fraction subtract(long a)
{
this.numerator -= a * this.denominator;
this.simplify();
return this;
}
Fraction multiply(long a)
{
this.numerator *= a;
this.simplify();
return this;
}
Fraction multiply(Fraction frac)
{
this.numerator *= frac.numerator;
this.denominator *= frac.denominator;
this.simplify();
return this;
}
Fraction divide(long a)
{
return multiply(new Fraction(1,a));
}
Fraction divide(Fraction frac)
{
return multiply(new Fraction(frac.denominator, frac.numerator));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment