首页 > 代码库 > 2017计蒜之道 初赛 第二场 百度的科学计算器(简单)

2017计蒜之道 初赛 第二场 百度的科学计算器(简单)

 

/**
题目:2017计蒜之道 初赛 第二场 百度的科学计算器(简单)
链接:https://nanti.jisuanke.com/t/15504
题意:给一个合法的表达式,包含加号+、减号-、括号()、数字常量,表达式中没有空格。
输入数据保证数字常量以及计算过程中数值绝对值均不超过 10^12??,对于浮点型数值常量,保证小数点后不超过 666 位。

思路:暴力模拟;python有函数可以直接调用。

坑点:如果表达式中出现过浮点数,那么输出结果保留6位小数,
否则输出整数,不出现小数。

*/

#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long LL;
const int mod=1e9+7;
const int maxn=1e6+5;
const double eps = 1e-12;
char op[1005];
double a[1004];
char s[1004];
int n;
int flag;
int main()
{
    while(scanf("%d",&n)==1)
    {
        scanf("%s",s);
        flag = 0;
        int az = 0, pz = 0;
        int len = strlen(s);
        for(int i = 0; i < len; ){
            LL in = 0;
            LL dt = 0;
            LL p = 1;
            if(s[i]>=0&&s[i]<=9){
                while(i<len&&s[i]>=0&&s[i]<=9){
                    in = in*10+(s[i]-0);
                    i++;
                }
                if(s[i]==.){
                    flag = 1;
                    i++;
                    while(i<len&&s[i]>=0&&s[i]<=9){
                        dt = dt*10+(s[i]-0);
                        i++;
                        p *= 10;
                    }
                }
                double x = in+1.0*dt/p;
                a[az++] = x;
            }else
            {
                if(s[i]==-){
                    op[pz++] = -;
                    i++;
                    continue;
                }
                if(s[i]==+){
                    i++;
                    op[pz++] = +;
                    continue;
                }
                if(s[i]==(){
                    i++;
                    op[pz++] = (;
                    continue;
                }
                if(s[i]==)){///左结合。找到左边的符号,以及左边的数,然后模拟计算过去。
                    int pl = pz-1;
                    while(op[pl]!=() pl--;
                    int temp = pl;// pz = tmep;

                    int cnt = pz-pl-1;
                    int tempa = az-cnt-1;
                    double value = http://www.mamicode.com/a[az-cnt-1];
                    for(int j = pl+1, k = az-cnt; j < pz; j++,k++){
                        if(op[j]==+){
                            value += a[k];
                        }else value -= a[k];
                    }

                    pz = temp;
                    az = tempa;
                    a[az++] = value;
                    i++;
                    continue;
                }
            }
        }


        double value = http://www.mamicode.com/a[0];///已处理所有括号,只有数和-,+符号。左结合计算。
        for(int j = 0, k = 1; j < pz; j++,k++){
            if(op[j]==+){
                value += a[k];
            }else value -= a[k];
        }
        if(flag)///如果出现过浮点数。
            printf("%.6lf\n",value);
        else
            printf("%lld\n",(LL)value);
    }
    return 0;
}

 

2017计蒜之道 初赛 第二场 百度的科学计算器(简单)