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

    很重要!!!

  • 相关阅读:
    FTP-实例(Md5验证)
    Socket-实例
    函数对象、函数嵌套、名称空间与作用域、装饰器
    Docker——手动创建镜像
    Docker——桥接网络配置
    Docker——网络和存储(数据卷)
    Docker-PS命令解析
    面试题44:扑克牌的顺子
    面试题42:翻转单词顺序VS左旋转字符串
    面试题41:和为s的两个数字VS和为s的连续正数序列
  • 原文地址:https://www.cnblogs.com/send-off-a-friend/p/11260084.html
Copyright © 2011-2022 走看看