zoukankan      html  css  js  c++  java
  • 1655 文本计算器

    1655: 文本计算器
    Time Limit: 1 Sec  Memory Limit: 128 MB
    Submit: 58  Solved: 16
    [Submit][Status][Web Board]
    Description
    Bob讨厌复杂的数学运算.
    看到练习册上的算术题,Bob很是头痛.
    为了完成作业,Bob想要你帮忙写一个文本版的四则运算计算器.
    这个计算器的功能需求十分简单,只要可以处理加减乘除和括号就可以了.
    你能够帮助Bob吗?

     


    Input
    每个样例一行,输入一个长度小于1500的包含有'(',')','+','-','*','/',和'1'~'9'组成的四则运算表达式.
    对于每个样例,参与运算数字在0~10000之间,表达式运算的结果在double的表示范围内.

     


    Output
    对于每一个例子,输出表达式的计算结果,精确到小数点后4位

     


    Sample Input
    3928*3180*3229+2137
    2477*8638
    1535+7452+3780+2061*280/3070/(7828-9348)

    Sample Output
    40333570297.0000
    21396326.0000

    12766.8763

    思路:用栈先进后出的特点,存入后将可计算得先计算得到结果后再存入,进行下一项计算。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <algorithm>
    using namespace std;
    const int MAX=1505;
    char data[MAX];
    double num[MAX]; //存数字
    char sign[MAX];  //存符号
    int ntop,stop;   //标记栈顶元素的位置
    double sum;   //结果
    
    void count() //基本的+-*/运算
    {
        if(sign[stop]=='+')
        {
            num[ntop-1]+=num[ntop];
            ntop--;
        }
        else if(sign[stop]=='-')
        {
            num[ntop-1]-=num[ntop];
            ntop--;
        }
        else if(sign[stop]=='*')
        {
            num[ntop-1]*=num[ntop];
            ntop--;
        }
        else if(sign[stop]=='/')
        {
            num[ntop-1]/=num[ntop];
            ntop--;
        }
        stop--;
    }
    
     int main()
     {
         int len;
    
         while(~scanf("%s",data))
         {
             ntop=0;
             stop=0;
             int markn=0,marks=0,marknode=0,ans=0,nodes;
             len=strlen(data);
             for(int i=0;i<=len;i++)
             {
                 if(i!=len&&(data[i]>='0'&&data[i]<='9'||data[i]=='.'))
                 {
                     if(data[i]=='.')//小数
                     {
                         marknode=1;//标记
                         nodes=0.1;
                     }
                     else
                     {
                         if(marknode)
                         {
                             ans=ans+(data[i]-'0')*nodes;
                             nodes=nodes*0.1;
                         }
                         else
                         ans=ans*10+data[i]-'0';
                         markn=1;
                     }
    
                 }
                 else
                 {
                     if(markn)
                     {
                         num[++ntop]=ans;
                         markn=0;
                         marknode=0;
                         ans=0;
                     }
                     if(i==len)break;
                     if(data[i]=='-'||data[i]=='+')
                     {
                         while(stop&&sign[stop]!='(')
                               count();
                               sign[++stop]=data[i];
                     }
                     else if(data[i]=='*'||data[i]=='/')
                     {
                         while(stop&&(sign[stop]=='*'||sign[stop]=='/'))
                         count();
                         sign[++stop]=data[i];
                     }
                     else if(data[i]==')')
                     {
                         while(stop&&sign[stop]!='(')
                               count();
                               stop--;
                     }
                     else
                     sign[++stop]=data[i];
    
                 }
             }
             while(stop)
             count();
             printf("%.4lf
    ",num[1]);
         }
     }
    
  • 相关阅读:
    深度学习训练模型时保存Log输出信息为文件
    Docker 测试场景领域应用剖析
    kafka性能测试
    [标点符] 初学机器学习算法之LightGBM (直方图+单边梯度采样优化+互斥特征绑定优化)
    【12月DW打卡】joyful-pandas
    【12月DW打卡】joyful-pandas
    【12月DW打卡】joyful-pandas
    【12月DW打卡】joyful-pandas
    【12月DW打卡】joyful-pandas
    Linux安装Redis
  • 原文地址:https://www.cnblogs.com/dshn/p/4750718.html
Copyright © 2011-2022 走看看