C++实现一元二次方程求解

题目描述

输入描述
每个案例是关于x的一个二次方程表达式,为了简单,每个系数都是整数形式。
输出描述
每个案例输出两个实数(由小到大输出,中间由空格隔开),保留两位小数;如果无解,则输出“No Solution”。

示例

输入
x^2+x=3x+4
输出
-1.24 3.24

解法

形如ax2+bx+c=0的一元二次方程, Δ \Delta Δ=b2-4ac。当 Δ \Delta Δ<0时,方程无实解;当 Δ \Delta Δ>=0时,方程有解,其解为x1= − b + Δ 2 a \frac{-b+ \sqrt\Delta}{2a} 2ab+Δ , x2=x1= − b − Δ 2 a \frac{-b-\sqrt \Delta}{2a} 2abΔ

  1. 将输入方程以等号为界分为左侧和右侧。
  2. 将两侧的式子都进行分割,形成形如ax2,bx,c的字符串,并将其放入vector中。
  3. 对vector进行遍历,分离出二次项、一次项、常数项系数,并分别相加。
  4. 将左侧得到的al,bl,cl与右侧得到的ar,br,cr作差,即可得到形如ax2+bx+c=0中的a,b,c。
  5. 利用求值公式即可求出方程的解x1,x2。
实现代码
#include <iostream>
#include <vector>
#include <algorithm>
#include<iomanip>
#include <cmath>
using namespace std;

void solution(string s,int &a,int &b,int &c)
{
    vector<string> v;
    int n=s.length(),begin=0;
    //分割
    for (int i=0;i<n;i++)
    {
        if (s[i]=='+')
        {
            v.push_back(s.substr(begin,i-begin));
            begin = i+1;
        }
        else if (s[i]=='-')
        {
            v.push_back(s.substr(begin,i-begin));
            begin = i;
        }
        else if(i==n-1)
            v.push_back(s.substr(begin,i-begin+1));
    }

    for (int i=0;i<v.size();i++)
    {
        if (v[i]=="")
            continue;
        if (v[i].length()>2&&v[i][v[i].length()-2]=='^')
        {
            if (v[i][0]=='x')
                a += 1;
            else if (v[i][0]=='-'&&v[i][1]=='x')
                a += -1;
            else
                a += stoi(v[i].substr(0,v[i].length()-3));
//             cout<<"二次系数:"<<a<<endl;
        }
        else if(v[i][v[i].length()-1]=='x')
        {
            if (v[i][0]=='x')
                b += 1;
            else if (v[i][0]=='-'&&v[i][1]=='x')
                b += -1;
            else
                b += stoi(v[i].substr(0,v[i].length()-1));
//             cout<<"一次系数:"<<b<<endl;
        }
        else 
        {
            c += stoi(v[i].substr(0,v[i].length()));
//             cout<<"常系数:"<<c<<endl;
        }
    }
}
//     2x^2+x+6-4x=3x+4
int main ()
{
    string s,sright,sleft;
    double x1,x2;
    
    while(cin>>s)
    {
        int n=s.length(),i;
        int ar=0,br=0,cr=0,al=0,bl=0,cl=0,a,b,c;
        double delta;
        for(i=0;i<n&&s[i]!='=';i++);
        sright = s.substr(0,i);
        sleft = s.substr(i+1,n-i-1);
        
        solution(sright,ar,br,cr);
//         cout<<ar<<" "<<br<<" "<<cr<<endl;
        solution(sleft,al,bl,cl);
//         cout<<al<<" "<<bl<<" "<<cl<<endl;
        
        a = ar-al;
        b = br-bl;
        c = cr-cl;
        delta = b*b-4*a*c;
        if (delta<0)
            cout<<"No Solution"<<endl;
        else
        {
            x1 = (-b-sqrt(delta))/2/a;
            x2 = (-b+sqrt(delta))/2/a;
            cout<<fixed<<setprecision(2)<<min(x1,x2)<<" "<<max(x1,x2)<<endl;
        }
    }
    
    return 0;
}

此代码可以适用于 a 1 x 2 + b 1 x + b 3 x + c 1 = a 2 x 2 + b 2 x + c 2 + c 3 a_1x^2+b_1x+b_3x+c_1=a_2x^2+b_2x+c_2+c_3 a1x2+b1x+b3x+c1=a2x2+b2x+c2+c3此类的非最简式,其中系数可以不为整数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值