C++ Square Form!
This commit is contained in:
parent
530d674933
commit
6744fa059e
2 changed files with 93 additions and 0 deletions
|
@ -11,3 +11,4 @@ add_executable(babylonian code/babylonian.cc)
|
||||||
add_executable(karatsuba code/karatsuba.cc)
|
add_executable(karatsuba code/karatsuba.cc)
|
||||||
add_executable(dice code/dice.cc)
|
add_executable(dice code/dice.cc)
|
||||||
add_executable(binomialExpansion code/binomialExpansion.cc)
|
add_executable(binomialExpansion code/binomialExpansion.cc)
|
||||||
|
add_executable(squareForm code/squareForm.cc)
|
||||||
|
|
92
languages/c++/code/squareForm.cc
Normal file
92
languages/c++/code/squareForm.cc
Normal file
|
@ -0,0 +1,92 @@
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
double power(double base, double exponent) {
|
||||||
|
double out = base;
|
||||||
|
|
||||||
|
for (int i = 1; i < exponent; i++) {
|
||||||
|
out *= base;
|
||||||
|
}
|
||||||
|
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Euclid algorithm
|
||||||
|
int greatestCommonDivisor(int a, int b) {
|
||||||
|
int currentA = a;
|
||||||
|
int currentB = b;
|
||||||
|
bool divisorFound = false;
|
||||||
|
|
||||||
|
while (currentA != currentB) {
|
||||||
|
if (currentA > currentB) {
|
||||||
|
currentA -= currentB;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentB > currentA) {
|
||||||
|
currentB -= currentA;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return currentA;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Simplify and then format a fraction
|
||||||
|
std::string formatFraction(int numerator, int denominator) {
|
||||||
|
int gcd = greatestCommonDivisor(numerator, denominator);
|
||||||
|
int n = numerator / gcd;
|
||||||
|
int d = denominator / gcd;
|
||||||
|
|
||||||
|
if (d == 1) {
|
||||||
|
return std::to_string(n);
|
||||||
|
} else {
|
||||||
|
// Fraction unicode
|
||||||
|
return std::to_string(n) + "\u2044" + std::to_string(d);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Format a double by cutting off as many trailing zeros as possible
|
||||||
|
std::string formatDouble(double input) {
|
||||||
|
std::string output = std::to_string(input);
|
||||||
|
int pointIndex = output.find_last_of('.');
|
||||||
|
int firstZeroIndex = output.find_last_not_of('0') + 1;
|
||||||
|
|
||||||
|
if (firstZeroIndex - 1 == pointIndex) {
|
||||||
|
output.erase(firstZeroIndex - 1, std::string::npos);
|
||||||
|
} else {
|
||||||
|
output.erase(firstZeroIndex, std::string::npos);
|
||||||
|
}
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ax² + b^x + c^x -> a(x + p) + q
|
||||||
|
std::string completeTheSquare(double a, double b, double c) {
|
||||||
|
// Calculate relevant values
|
||||||
|
double p = b / (2 * a);
|
||||||
|
double q = c - (power(b, 2) / 4 * a);
|
||||||
|
std::string output = "(x";
|
||||||
|
|
||||||
|
// Add the p value
|
||||||
|
if (p != 0) {
|
||||||
|
std::string sign = p > 0 ? "+" : "-";
|
||||||
|
output += " " + sign + " " + formatFraction(b, 2 * a) + ")²";
|
||||||
|
} else {
|
||||||
|
output += ")²";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add the q value
|
||||||
|
if (q != 0) {
|
||||||
|
std::string sign = q > 0 ? "+" : "-";
|
||||||
|
output += " " + sign + " " + formatDouble(q);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add the coefficient if relevant
|
||||||
|
if (a > 1) {
|
||||||
|
output.insert(0, formatDouble(a));
|
||||||
|
}
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
std::cout << completeTheSquare(1, 2, 5);
|
||||||
|
}
|
Loading…
Reference in a new issue