洛谷P1022 计算器的改良

洛谷P1022 计算器的改良

题目背景

NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能。实验室将这个任务交给了一个刚进入的新手ZL先生。

题目描述

为了很好的完成这个任务,ZLZL先生首先研究了一些一元一次方程的实例:

4+3x=8

6a-5+1=2-2a

-5+12y=0

ZLZL先生被主管告之,在计算器上键入的一个一元一次方程中,只包含整数、小写字母及+、-、=这三个数学符号(当然,符号“-”既可作减号,也可作负号)。方程中并没有括号,也没有除号,方程中的字母表示未知数。

你可假设对键入的方程的正确性的判断是由另一个程序员在做,或者说可认为键入的一元一次方程均为合法的,且有唯一实数解。

输入格式

一个一元一次方程。

输出格式

解方程的结果(精确至小数点后三位)。

输入输出样例

输入 #1
6a-5+1=2-2a
输出 #1
a=0.750

#include<bits/stdc++.h>
using namespace std;
string sentence;
int dl1,dl2,ta;//系数&常数项 
int xs(int n,int t)
{
    if(sentence[n]>='0'&&sentence[n]<='9')
        return xs(n+1,t*10+sentence[n]-'0');
    ta=n;
    return t;
}
int main()
{

    getline(cin,sentence);
    char x;
    int zf=1,w=0,t=-1,fh;
    while(sentence[++t]!='\0')
    {
        fh=1;
        if(sentence[t]=='=') 
        {
            zf=-1;
            continue;
        }
        if(sentence[t]=='-')
        {
            fh=-1;
            t++;
        }
        if(sentence[t]>='a'&&sentence[t]<='z')
        {
            x=sentence[t];
            dl1+=zf*fh;
            continue;
        }
        if(sentence[t]<='9'&&sentence[t]>='0')
        {
            int n=xs(t,0);
            t=ta;
            if(sentence[t]>='a'&&sentence[t]<='z')
            {
                dl1+=n*zf*fh;
                x=sentence[t];
            }            
            else
            {
                dl2+=n*zf*fh;
                t--; 
            } 
        }
        
    }
    cout<<x<<"=";
    //double会出现-0的情况!
    double ans= -dl2/(dl1*1.0);
    if(ans==-0.000) ans=0.000;
    printf("%.3lf",ans); 
    return 0;
}

solution

首先一次性读入这个式子

再逐个判断

遇到等号就把zf(正负)设为-1

(zf在循环前要设为1)

遇到减号/负号就把fh(符号)设为-1

(fh在每次循环开始时要初始化为1)

遇到数字就进入函数,返回这个数字串的实值

同时看下一位是不是字母,是的话就放到dl1(系数)里,否则放到dl2(常数项)里

最后移项(*-1)

系数化为一

double是有-0的!!!

这就是为什么总有一个点过不去,答案是0。000,一般程序则会输出-0.000

所以加一个特判

如果ans是-0.000,ans=0.000

The End

很重要!!!

 

posted @ 2019-07-28 17:42  Vanilla_chan  阅读(478)  评论(0编辑  收藏  举报