首页 > 其他 > 详细

洛谷P1022 计算器的改良

时间:2019-07-28 19:55:11      阅读:68      评论:0      收藏:0      [点我收藏+]

---恢复内容开始---

 

洛谷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

很重要!!!

 

洛谷P1022 计算器的改良

原文:https://www.cnblogs.com/send-off-a-friend/p/11260084.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!