解一元二次方程

0AND1STORY

2019-05-20 13:15:42

Personal

最近学校讲到用公式法解一元二次方程,计算比较繁琐,于是便想到用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; } ```