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

来源:互联网 发布:网易域名管理网站 编辑:程序博客网 时间:2024/06/10 09:46

https://nanti.jisuanke.com/t/15504

大概就是一个模拟
遇到一个新括号就当作提升一个level然后将原来level的结果压入栈内 括号结束后再弹出

需要的注意是有个强制转换的关系 如果没有出现浮点数答案是输出整数
并且整数会爆int(比赛死在这里了哭哭)

#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <queue>#include <cstdio>#include <map>#include <set>#include <utility>#include <stack>#include <cstring>#include <cmath>#include <vector>using namespace std;#define pb push_back#define scand(n) scanf("%d",&n)#define scandd(n,m) scanf("%d%d",&n,&m)#define scanddd(n,m,k) scanf("%d%d%d",&n,&m,&k)#define scanlld(n) scanf("%lld",&n)#define scanlldd(n,m) scanf("%lld%lld",&n,&m)#define scanllddd(n,m,k) scanf("%lld%lld%lld",&n,&m,&k)#define scanlf(n) scanf("%lf",&n)#define scanlff(n,m) scanf("%lf%lf",&n,&m)#define scanlfff(n,m,k) scanf("%lf%lf%lf",&n,&m,&k)#define scans(str) scanf("%s",str)#define ans() printf("%d",ans)#define ansn() printf("%d\n",ans)#define anss() printf("%d ",ans)#define llans() printf("%lld",ans)#define llanss() printf("%lld ",ans)#define llansn() printf("%lld\n",ans)#define REP(i,n) for(int i=0;i<(n);++i)#define REA(i,qwe,ewr) for(int i=qwe;i<=ewr;++i)#define RER(i,qwe,ewr) for(int i=qwe;i>=ewr;--i)#define mst(abc,bca) memset(abc,bca,sizeof abc)#define all(a) a.begin(),a.end()#define pii pair<int,int>#define mp make_pairtypedef long long ll;inline int read(){    int x=0,f=1;    char ch=getchar();    while(ch<'0'||ch>'9')    {        if(ch=='-') f=-1;        ch=getchar();    }    while(ch>='0'&&ch<='9')    {        x=x*10+ch-'0';        ch=getchar();    }    return x*f;}inline int mul_mod(int a, int b, int mo){    int ret;    __asm__ __volatile__ ("\tmull %%ebx\n\tdivl %%ecx\n" : "=d"(ret):"a"(a),"b"(b),"c"(mo));    return ret;}const int mod = 1000000007;const double eps=1e-9;const int INF=0x3f3f3f3f;const int MAXN=3001105;char s[5000];int main(){#ifdef LOCAL    freopen("input.txt","r",stdin);//    freopen("output.txt","w",stdout);#endif // LOCAL    int n;    scand(n);    scans(s+1);    stack<double>num;    stack<char>sy;    n=strlen(s+1);//    double ans =0;    double now = 0 ;    char sym='+';    double check=0;    bool point=0;    double lit;    bool had=0;    int cir=0;    bool ok=1;    for(int i=1;i<=n;++i)    {        char ch = s[i];        if(s[i]=='(')        {            sy.push(sym);            sym = '+';            num.push(now);            now=check=0;            point=0;            cir++;        }        else if(s[i]==')')        {            now+=check;            check = now;            sym = sy.top();sy.pop();            now = num.top();num.pop();            int idx = sym=='+'?1:-1;            now+=idx*check;            check=0;            sym = '+';            point=0;            cir--;        }        else if(s[i]=='+'||s[i]=='-')        {            now+=check;            check=0;            sym = s[i];            point=0;        }        else        {            int idx = sym=='+' ? 1:-1;            if(s[i]>='0'&&s[i]<='9')            {                if(point)                {                    check+=idx*lit*(s[i]-'0');                    lit/=10;                }                else                {                    check*=10;                    check+=idx*(s[i]-'0');                }            }            else if(s[i]=='.')            {                point=1;                lit=0.1;                had=1;            }        }    }    if(cir)return 0*printf("No Answer");    ll ans = now + check;    if(had)    printf("%f",now+check);    else llans();    return 0;}
阅读全文
0 0
原创粉丝点击