zoukankan      html  css  js  c++  java
  • 洛谷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]!='')
        {
            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

    很重要!!!

  • 相关阅读:
    linux 程序安装目录/opt目录和/usr/local目录的区别
    Linux文件目录结构详解
    Jenkins卸载方法(Windows/Linux/MacOS)
    Jmeter案例demo
    idea打包java可执行jar包
    查看端口状态
    轻松掌握mongodb
    sphinx和coreseek
    redis
    redis默认端口6379以其名命名,是我孤陋寡闻了,是名性感美女(梅尔兹)
  • 原文地址:https://www.cnblogs.com/send-off-a-friend/p/11260084.html
Copyright © 2011-2022 走看看