九度oj-题目1103:二次方程计算器

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:2799

解决:633

题目描述:

设计一个二次方程计算器

输入:

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

输出:

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

样例输入:
x^2+x=3x+4
样例输出:
-1.24 3.24
来源:
2011年上海交通大学计算机研究生机试真题
因为是多组输入,导致WA一发!
分析:统计x^2的系数,统计x的系数,统计常数和。转换成ax^2+bx+c=0的形式,公式法求解。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main()
{
    char s[200];
    int i, j, len;
    while(scanf("%s", s)!=EOF)
    {
    len=strlen(s);

    int a=0, b=0, c=0;
    int A=0, B=0, C=0;

    int pos;

    for(i=0; i<len; i++){
        if(s[i]=='='){
            pos=i; break;
        }
    }//先找到到=

    for(i=0; i+2<pos; i++){
        if(s[i]=='x' && s[i+1]=='^' && s[i+2]=='2'){
            if(i-1==-1){ a=a+1; }
            else if(i-1>-1){
                int jin=1;
                int cur=0;
                j=i-1;
                while(isdigit(s[j]) && j>=0){
                    cur=cur+(s[j]-48)*jin;
                    jin=jin*10;
                    j--;
                }
                if(cur==0) cur=1;
                if(j>=0 && s[j]=='-') cur=-cur;
                a+=cur;
            }
        }
    }
    for(i=pos+1; i+2<len; i++){
        if(s[i]=='x' && s[i+1]=='^' && s[i+2]=='2'){
            if(i-1==pos){ A=A+1; }
            else if(i-1>pos){
                int jin=1;
                int cur=0;
                j=i-1;
                while(isdigit(s[j]) && j>pos){
                    cur=cur+(s[j]-48)*jin;
                    jin=jin*10;
                    j--;
                }
                if(cur==0) cur=1;
                if(j>pos && s[j]=='-') cur=-cur;
                A+=cur;
            }
        }
    }
    //printf("%d\n", a-A);

    for(i=0; i<pos; i++){
        if(s[i]=='x' && s[i+1]!='^'){//这一定是x的一次方
            int jin=1;
            int cur=0;
            j=i-1;
            while(isdigit(s[j]) && j>=0){
                cur=cur+jin*(s[j]-48);
                jin=jin*10;
                j--;
            }
            if(cur==0) cur=1;
            if(j>=0 && s[j]=='-') cur=-cur;
            b+=cur;
        }
    }

    for(i=pos+1; i<len; i++){
        if(s[i]=='x'){
            if(i+1<len ){
                if(s[i+1]!='^'){
                    int jin=1;
                    int cur=0;
                    j=i-1;
                    while(isdigit(s[j]) && j>pos){
                        cur=cur+jin*(s[j]-48);
                        jin=jin*10;
                        j--;
                    }
                    if(cur==0) cur=1;
                    if(j>pos && s[j]=='-') cur=-cur;
                    B+=cur;
                }
            }else{
                int jin=1;
                int cur=0;
                j=i-1;
                while(isdigit(s[j]) && j>pos){
                    cur=cur+jin*(s[j]-48);
                    jin=jin*10;
                    j--;
                }
                if(cur==0) cur=1;
                if(j>pos && s[j]=='-') cur=-cur;
                B+=cur;
            }
        }
    }
    //printf("%d\n", b-B);

    for(i=0; i<=pos; i++){
        if(s[i]=='+'||s[i]=='-'||s[i]=='='){
            int jin=1;
            int cur=0;
            j=i-1;
            while(isdigit(s[j]) && j>=0){
                cur=cur+jin*(s[j]-48);
                jin=jin*10;
                j--;
            }
            if(j>=0 && s[j]=='^') cur=0;
            if(j>=0 && s[j]=='-') cur=-cur;
            c+=cur;
        }
    }
    for(i=pos+1; i<len; i++){
        if(s[i]=='+' || s[i]=='-'){
            int jin=1;
            int cur=0;
            j=i-1;
            while(isdigit(s[j]) && j>pos){
                cur=cur+jin*(s[j]-48);
                jin=jin*10;
                j--;
            }
            if(j>pos && s[j]=='^') cur=0;
            if(j>pos && s[j]=='-') cur=-cur;
            C+=cur;
        }
    }
    if(isdigit(s[len-1])){
        int jin=1;
        int cur=0;
        j=i-1;
        while(isdigit(s[j]) && j>pos){
            cur=cur+jin*(s[j]-48);
            jin=jin*10;
            j--;
        }
        if(j>pos && s[j]=='^') cur=0;
        if(j>pos && s[j]=='-') cur=-cur;
        C+=cur;
    }
    //printf("%d\n", c-C);

    a=a-A;
    b=b-B;
    c=c-C;
    double dd=b*b-4*a*c;
    if(dd<0){
        printf("No Solution\n");
    }else{
        double ans;
        ans=(-b-sqrt(b*b-4*a*c))/(2.0*a);
        printf("%.2lf ", ans);
        ans=(-b+sqrt(b*b-4*a*c))/(2.0*a);
        printf("%.2lf\n", ans);
    }

    }
    return 0;
}

  

posted @ 2015-10-16 20:23  我喜欢旅行  阅读(277)  评论(0编辑  收藏  举报