解一元二次方程
0AND1STORY
2019-05-20 13:15:42
最近学校讲到用公式法解一元二次方程,计算比较繁琐,于是便想到用C++写一个解一元二次方程的程序(**结果需包含分式或根式**)
---
## 代码如下:
```cpp
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
class Root {
public:
int k, root;
Root(int ck = 1, int cr = 0) {
k = ck;
root = cr;
update();
}
void assign(int ck, int cr) {
k = ck;
root = cr;
update();
}
void update() {
for (int i = 2; i*i <= root; i ++) {
while (root % (i*i) == 0) {
k *= i;
root /= i * i;
}
}
}
void print() {
if (root == 1) printf("%d", k);
else printf("%dv%d", k, root);
}
operator double() {
return k * sqrt(root);
}
};
typedef
class Frac {
public:
int up, down;
Frac(int cu = 1, int cd = 1) {
up = cu;
down = cd;
update();
}
void assign(int cu, int cd) {
up = cu;
down = cd;
update();
}
void update() {
if (up == 0) {
down = 1;
return;
}
int i = abs(up), j = abs(down);
while (i != j) {
if (i > j) i -= j;
else j -= i;
}
up /= i;
down /= i;
}
void print() {
if (down == 1) printf("%d", up);
else printf("%d/%d", up, down);
}
operator double() {
return (double) up / down;
}
} Ration;
class Real {
public:
int up, down, k, root;
Real(int cu = 1, int cd = 1, int ck = 1, int cr = 0) {
up = cu;
down = cd;
k = ck;
root = cr;
update();
}
void assign(int cu, int cd, int ck, int cr) {
up = cu;
down = cd;
k = ck;
root = cr;
update();
}
void update() {
k = Root(k, root).k;
root = Root(k, root).root;
int i = up / Frac(up, down).up, j = abs(k);
while (i != j) {
if (i > j) i -= j;
else j -= i;
}
up /= i;
down /= i;
k /= i;
}
void print() {
if (down != 1) printf("(");
if (up != 0) printf("%d", up);
if (k == 1 && root != 1) printf("+");
else if (k == -1 && root != 1) printf("-");
else printf("%+d", k);
if (root != 1) printf("v%d", root);
if (down != 1) printf(")/%d", down);
}
operator double() {
return (up + k*sqrt(root)) / down;
}
};
class SolveEquation {
public:
int a, b, c;
Root delta;
void calc() {
input();
delta.assign(1, b*b - 4*a*c);
printf("delta=sqrt(%d)=", delta.k*delta.k*delta.root);
delta.print();
printf("\n");
if (delta.root < 0) {
printf("No Real Solution!\n\n");
return;
}
if (delta.root == 1) {
Frac x_1, x_2;
x_1.assign(-b+delta.k, 2*a);
printf("x_1=");
x_1.print();
printf("=%.16g", (double)x_1);
printf("\n");
x_2.assign(-b-delta.k, 2*a);
printf("x_2=");
x_2.print();
printf("=%.16g", (double)x_2);
printf("\n");
} else {
Real x_1, x_2;
x_1.assign(-b, 2*a, delta.k, delta.root);
printf("x_1=");
x_1.print();
printf("=%.16g", (double)x_1);
printf("\n");
x_2.assign(-b, 2*a, -delta.k, delta.root);
printf("x_2=");
x_2.print();
printf("=%.16g", (double)x_2);
printf("\n");
}
printf("\n");
}
void input() {
scanf("%d%d%d", &a, &b, &c);
}
};
SolveEquation solve;
int main() {
while (1) {
solve.calc();
}
return 0;
}
```