人生艰难之九度OJ 1103 1101

题目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了。。。。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值