Last active
December 1, 2020 21:16
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* 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