1. 程式人生 > >2017計蒜之道 初賽 第二場 百度的科學計算器(簡單)

2017計蒜之道 初賽 第二場 百度的科學計算器(簡單)

line ret ext while () value nan pytho sca

/**
題目: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計蒜之道 初賽 第二場 百度的科學計算器(簡單)