一元二次方程带根号的求解

众所周知,一元二次方程的求解公式为
x = − b ± b 2 − 4 a c 2 a x=\frac{-b\pm\sqrt{b^2-4ac}}{2a} x=2ab±b24ac
但是,如果你从计算机里输入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
         则输出结果为整式
         否则直接输出根式即可
         此处代码省略
	*/
}

最后我们就可以得到带根号的结果了!
(自己完善后的测试程序展示)
在这里插入图片描述


如有错误请指出,谢谢~

  • 13
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值