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

Posted 天道酬勤007

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 = 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 = 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计蒜之道 初赛 第二场 百度的科学计算器(简单)的主要内容,如果未能解决你的问题,请参考以下文章

2018 计蒜之道 初赛 第二场

2017 计蒜之道 初赛 第一场 AB题

2017 计蒜之道 初赛 第五场 UCloud 的安全秘钥(中等)

2017 计蒜之道 初赛 第一场 B.阿里天池的新任务

2018 计蒜之道 初赛 第一场

2018 计蒜之道 初赛 第一场