九度oj-1103

题目描述:

设计一个二次方程计算器

输入:

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

输出:

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

样例输入:

x^2+x=3x+4

样例输出:

-1.24 3.24

代码:

#include <iostream>  
#include <iomanip>  
#include <math.h>  
#include <ctype.h>  
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'){    //系数为正负1的情况   
            if(i+1 < str.length() && str[i+1] == '^'){  
                if(i-1>=0 && str[i-1] == '-')  
                    A = A - 1;  
                else  
                    A += 1;  
                i = i + 3;  
            }  
            else{  
                if(i-1>=0 && str[i-1] == '-')  
                    B = B -1;  
                else   
                    B += 1;  
                i = i + 1;  
            }     
        }  
        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 = i + 3;  
                }     
                else{  
                    B += temp;  
                    i = i + 1;  
                }  
            }  
            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 str_left,str_right;  
        str_left = str.substr(0,j);  
        str_right = str.substr(j+1);  
        int A1 = 0,B1 = 0,C1 = 0;  
        int A2 = 0,B2 = 0,C2 = 0;  
        operate(str_left,A1,B1,C1);  
        operate(str_right,A2,B2,C2);  
        int a = A1 - A2;  
        int b = B1 - B2;  
        int c = C1 - C2;   //化方程为标准式,a,b,c为系数  
        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;  
}  

作者提醒:

将输入的方程式化为标准式,即ax^2+bx+c=0的形式,这里面存在很多步骤,
比如合并同阶的项,移项等等。

在这里,我是将等式一分为二,等号作为分界线,等式左右两边分别求出x^2,x,常数项的系数,
然后分别作差求得系数a,b,c

之后只要根据二次方程的公式法求解即可,再注意一下小数点。

这里在进行求系数的过程中,要注意系数可能有多位,系数可能是负数等等情况。