众所周知,一元二次方程的求解公式为
x
=
−
b
±
b
2
−
4
a
c
2
a
x=\frac{-b\pm\sqrt{b^2-4ac}}{2a}
x=2a−b±b2−4ac
但是,如果你从计算机里输入a,b,c,
利用这个公式,它并不会保留根号,而是会直接算出近似值!!!
在这里,我会把保留根号输出的方法整理一下,仅供参考.(笔记)
原理准备:
1.辗转相除法(用于化简分式)
有两个数a,b,我们可以利用这个方法求其最大公因数.
例如有两个数 18与81,
18 = 9×2 , 81 = 9×9
所以18, 81有最大公因数9
用辗转相除法的过程如下:
81 ÷ 18 = 4 ······ 9
18 ÷ 9 = 2 ······ 0
则当余数为0的时候,最后一次算式的除数就是这两个数的最大公因数
(伪代码)代码逻辑为:
函数 gcb(num1,num2){
num3 = num1 取余 num2
循环{
if(num3 == 0) 返回 num2
num1 = num2
num2 = num3
num3 = num1 取余 num2
}
}
c++代码:
int gcb(int num_1,int num_2){
//取绝对值
int num1 = abs(num_1);
int num2 = abs(num_2);
int num3 = num1 % num2;
while(true){
if(num3 == 0){
return num2;
}
num1 = num2;
num2 = num3;
num3 = num1 % num2;
}
}
求三个数(a,b,c)的最大公因数,则求ab的最大公因数 x1,再求a,c的最大公因数x2,最后求出x1,x2的公因数即可.
伪代码:
函数 gcb2(a,b,c){
x1 = gcb(a,b)
x2 = gcb(a,c)
返回 gcb(x1,x2)
}
2.因式分解(用于提取根号下的完全平方数)
通过计算,我们可能得到带根号的结果.
但是我们需要化简分数,因此我们会把根号的结果简化,如:
80
=
4
5
\sqrt{80} = 4\sqrt{5}
80=45
我的解决办法是:
将80拆分成为2×2×2×2×5, 然后将**每两个重复的提取出来相乘****,剩下的在根号内相乘,**即为2×2=4 和 5.
c++代码为:
// x为根号下的数 , a是根号外的系数(上方的4), b为根号内剩余的数(上方的5)
bool deal_1(int x,int& a,int& b) {
if (x < 0) return false;
int n = x;
int i = 2;
vector<int> yz = {}; // yz用来存储因子
while (n != 1) {//获取所有因子
if (n % i == 0) {
n /= i;
yz.push_back(i);//记录因子
}
else {
i++;
}
}
int length = yz.size();
int aa = 1;// 根号外的数字
for (int i = 0; i < length;i++) {//循环查找每两次相同向系数乘一次数
for (int o = i+1; o < length; o++) {
if (yz[i] == yz[o]) {
aa *= yz[i];
//这里换成1后并不影响乘积,并比删除该项更容易处理
yz[i] = 1;
yz[o] = 1;
break;
}
}
}
a = aa;//向a赋值
int bb = 1; // 根号下的数字
for (int i = 0; i < length; i++) {
bb *= yz[i];
}
b = bb;//向b赋值
}
公式处理:
我们把公式可以看成这几部分组成:
x
=
部分
1
±
部分
2
部分
3
部分
4
x=\frac{部分1\pm部分2\sqrt{部分3}}{部分4}
x=部分4部分1±部分2部分3
在这里,部分1 = -b,
我们需要用b²-4ac通过上方的deal_!函数转换为部分2与部分3
部分4 = 2a
然后我们提取部分1,部分2,部分3的最大公因数 g
然后用部分1,部分2,部分3除以g,化简分数
c++代码如下
void deal(int a,int b,int c){
int dt = b*b - (4*a*c);
int part1,part2,part3,part4;
part1 = -b;
part4 = 2*a;
deal_1(dt,part2,part3);
int max_g = gcb(part1,part2,part4);
part1 /= max_g;
part2 /= max_g;
part4 /= max_g;
/* 在此处输出结果 */
/*
如果part4 为 1
或者 part1 + part2 √part3之和 取余 part 4为 0
则输出结果为整式
否则直接输出根式即可
此处代码省略
*/
}
最后我们就可以得到带根号的结果了!
(自己完善后的测试程序展示)
如有错误请指出,谢谢~