1103.二次方程计算器

题目描述:

设计一个二次方程计算器

输入:

每个案例是关于x的一个二次方程表达式,为了简单,每个系数都是整数形式。

输出:

每个案例输出两个实数(由小到大输出,中间由空格隔开),保留两位小数;如果无解,则输出“No Solution”。

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

 

#include<iostream>
#include<cstring>
#include<cmath>
#include<iomanip> 
using namespace std;

void operate(string str,int &a,int &b,int &c){
    for(int i=0;i<str.length();i++){
        if(str[i]=='+') continue;
        else if(str[i]=='-'){
        } else if(str[i]=='x'){
            if(i+1<str.length()&&str[i+1]=='^'){
                if(i-1>=0&&str[i-1]=='-')
                a=a-1;
                else a+=1;
                i+=3;
            }
            else {
                if(i-1>=0 &&str[i-1]=='-')
                b--;
                else b++;
                i++;
            }
        }
        else {
            int temp=0;
            int j=i;
            while(isdigit(str[i])){
                temp=temp*10+str[i]-'0';
                i++;
            }
            if(j-1>=0&&str[j-1]=='-')
            temp=0-temp;
            if(i<str.length()&&str[i]=='x'){
                if(i+1<str.length()&&str[i+1]=='^'){
                    a+=temp;
                    i+=3;
                }
                else {
                    b+=temp;
                    i++;
                }
            }
            else c+=temp;
        }
    }
}

int main(){
    string str;
    while(cin>>str){
        int j=0;
        for(int i=0;i<str.length();i++){
            if(str[i]=='=')
            j=i;
        }
        string strleft,strright;
        strleft=str.substr(0,j);
        strright=str.substr(j+1);
        int a1=0,b1=0,c1=0;
        int a2=0,b2=0,c2=0;
        operate(strleft,a1,b1,c1);
        operate(strright,a2,b2,c2);
        int a=a1-a2;
        int b=b1-b2;
        int c=c1-c2;
        int temp=b*b-4*a*c;
        if(temp<0) cout<<"No Solution"<<endl;
        else {
            double x1,x2;
            x1=(double)(0-b+sqrt(temp))/(2*a);
            x2=(double)(0-b-sqrt(temp))/(2*a);
            if(x1<x2)
            cout<<fixed<<setprecision(2)<<x1<<" "<<x2<<endl;
            else
            cout<<fixed<<setprecision(2)<<x2<<" "<<x1<<endl;
        }
    }
    return 0;
}

 

posted @ 2018-10-02 10:31  bernieloveslife  阅读(294)  评论(0编辑  收藏  举报