人生艰难之九度OJ 1103 1101

来源:互联网 发布:思想聚焦知乎 编辑:程序博客网 时间:2024/04/30 18:42
题目1103:二次方程计算器

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:2720

解决:612

题目描述:

设计一个二次方程计算器

输入:

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

输出:

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

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

思路:很直白的模拟,但是细节和边界要处理好,大致的模拟思路就是分等号左右边,记录下二次项,一次项和常数项的系数,这里要特别注意符号,把sgn变化的位置写挫了然后一直在跪,然而自己给的各种样例都能过也真是感动中国了。。记录好之后相减,然后得到正常的一元二次方程,然后用判别式求解就可以了。

#include<cstdio>#include<cstring>#include<cmath>#include<iostream>#include<algorithm>#include<string>using namespace std;string s;int main(){    while(cin>>s)    {        int pos;        for(int i=0;s[i]!='\0';i++)        {            if(s[i]=='=')            {                pos=i;                break;            }        }//找等号        int al,bl,cl;        al=bl=cl=0;        int ar,br,cr;        ar=br=cr=0;        int tmp=0;        int sgn=1;        for(int i=0;i<pos;)//处理左半部分        {            if(s[i]>='0'&&s[i]<='9')            {                tmp=tmp*10+s[i]-'0';                i++;            }//扫系数            else if(s[i]!='x')//要么是常数项要么是符号            {                if(s[i]=='+')                {                    cl+=tmp*sgn;                    sgn=1;                }                else if(s[i]=='-')                {                    cl+=tmp*sgn;                    sgn=-1;                }                i++;                tmp=0;//及时清零            }            else if(s[i]=='x'&&s[i+1]=='^')//二次项            {                if(i==0||s[i-1]=='+'||s[i-1]=='-')//特别注意一下在起始位置系数为1或-1                    tmp=1;                    al+=tmp*sgn;                    tmp=0;                    i=i+3;//连跳3个            }             else if(s[i]=='x'&&s[i+1]!='^')            {                if(i==0||s[i-1]=='+'||s[i-1]=='-')                    tmp=1;                    bl+=tmp*sgn;                    tmp=0;                    i++;            }            //cout<<2333<<endl;        }       cl+=tmp*sgn;         tmp=0;        sgn=1;         for(int i=pos+1;s[i]!='\0';)        {            if(s[i]>='0'&&s[i]<='9')            {                tmp=tmp*10+s[i]-'0';                i++;            }            else if(s[i]!='x')            {                if(s[i]=='+')                {                    cr+=tmp*sgn;                     sgn=1;                }                else if(s[i]=='-')                {                    cr+=tmp*sgn;                     sgn=-1;                }                i++;                tmp=0;            }            else if(s[i]=='x'&&s[i+1]=='^')            {                if(i==pos+1||s[i-1]=='+'||s[i-1]=='-')                    tmp=1;                    ar+=tmp*sgn;                    tmp=0;                    i=i+3;            }             else if(s[i]=='x'&&s[i+1]!='^')            {                if(i==pos+1||s[i-1]=='+'||s[i-1]=='-')                    tmp=1;                    br+=tmp*sgn;                    tmp=0;                    i++;            }            //cout<<2333<<endl;        }       cr+=tmp*sgn;       double a,b,c;       a=(al-ar)*1.0;       b=(bl-br)*1.0;       c=(cl-cr)*1.0;       if(b*b-4*a*c>=0)//基本判断有无解       {           double x1=(-b-sqrt(b*b-4.0*a*c))/(2.0*a);           double x2=(-b+sqrt(b*b-4.0*a*c))/(2.0*a);           double mina=min(x1,x2);           double maxn=max(x1,x2);           printf("%.2lf %.2lf\n",mina,maxn);       }       else       {           cout<<"No Solution"<<endl;       }    }    return 0;}

题目1101:计算表达式

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:4276

解决:1311

题目描述:

对于一个不存在括号的表达式进行计算

输入:

存在多种数据,每组数据一行,表达式不存在空格

输出:

输出结果

样例输入:
6/2+3+3*4
样例输出:
18
思路:赤裸裸的栈模拟,两个栈,一个符号栈,一个数字栈,然后因为没有括号,所以根据当前的符号来判断是否弹栈计算还是入栈之后在计算,自己手动模拟一下就好,数据结构书上的题,然而原来在HDU写的简单计算器的代码发现数据水了,根本处理不了负数,还写在一个主函数里,然后这次写函数,完善了一下。

#include<cstdio>#include<cstring>#include<cmath>#include<iostream>#include<algorithm>#include<stack>using namespace std;stack<int> sn;stack<char>sc;int n;int i;char s[1005];int getnum(){    int tmp=0;    while(s[i]>='0'&&s[i]<='9')    {        tmp=tmp*10+s[i]-'0';        i++;    }    return tmp;}char getch(){    return s[i++];}void calc(){    int a,b,t;    char c;    if(sc.empty())        return ;    a=sn.top();    sn.pop();    b=sn.top();    sn.pop();    c=sc.top();    sc.pop();   // cout<<a<<"~~"<<b<<"~~"<<c<<endl;    switch(c)    {        case '+':            t=b+a;            break;        case '-':            t=b-a;            break;        case '*':            t=b*a;            break;        case '/':            t=b/a;            break;    }    sn.push(t);}int main(){    while(cin>>s)    {        i=0;        char op;        n=getnum();        //cout<<n<<endl;        sn.push(int(n));        while(s[i]!='\0')        {            op=getch();            n=getnum();          //  cout<<op<<"~~"<<n<<endl;            if(op=='+'||op=='-')            {                calc();             //   cout<<sn.top()<<"~~"<<endl;                sc.push(op);                sn.push(int(n));            }            else            {                sc.push(op);                sn.push(int(n));                calc();              //  cout<<sn.top()<<"~~"<<endl;            }        }        while(!sc.empty())        {            calc();          //  cout<<sn.top()<<"~~"<<endl;        }        cout<<sn.top()<<endl;        sn.pop();    }    return 0;}

SJTU的题目明显更好,然而纱布般的我做这种题无法1A,又听说CCNU机试只能提交一次,所以要GG了。。。。



0 0