生活随笔
收集整理的這篇文章主要介紹了
NYOJ 128 前缀式计算
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
前綴式計(jì)算
時(shí)間限制:
1000?ms ?|? 內(nèi)存限制:
65535?KB 難度:
3
描述
先說明一下什么是中綴式:
如2+(3+4)*5這種我們最常見的式子就是中綴式。
而把中綴式按運(yùn)算順序加上括號(hào)就是:(2+((3+4)*5))
然后把運(yùn)算符寫到括號(hào)前面就是+(2 *( +(3 4) 5) )
把括號(hào)去掉就是:+ 2 * + 3 4 5
最后這個(gè)式子就是該表達(dá)式的前綴表示。
給你一個(gè)前綴表達(dá)式,請(qǐng)你計(jì)算出該前綴式的值。
比如:
+ 2 * + 3 4 5的值就是 37
輸入有多組測(cè)試數(shù)據(jù),每組測(cè)試數(shù)據(jù)占一行,任意兩個(gè)操作符之間,任意兩個(gè)操作數(shù)之間,操作數(shù)與操作符之間都有一個(gè)空格。輸入的兩個(gè)操作數(shù)可能是小數(shù),數(shù)據(jù)保證輸入的數(shù)都是正數(shù),并且都小于10,操作數(shù)數(shù)目不超過500。
以EOF為輸入結(jié)束的標(biāo)志。輸出對(duì)每組數(shù)據(jù),輸出該前綴表達(dá)式的值。輸出結(jié)果保留兩位小數(shù)。樣例輸入 + 2 * + 3 4 5
+ 5.1 / 3 7 樣例輸出 37.00
5.53 AC碼: // 調(diào)用庫函數(shù),遞歸#include<stdio.h>
#include<stdlib.h>
char str[20];
double fun()
{if(scanf("%s",str)==EOF)return 1<<30;if(str[0]=='+')return fun()+fun();if(str[0]=='-')return fun()-fun();if(str[0]=='*')return fun()*fun();if(str[0]=='/')return fun()/fun();return atof(str);//atof在stdlib.h中的把str字符串轉(zhuǎn)換成double;//atoi在stdlib.h中的把str字符串轉(zhuǎn)換成int;
}
int main()
{while(1){double tp=fun();if(tp<1<<30)printf("%.2lf\n",tp);elsebreak;}
}
AC碼:
#include<stdio.h>
char str[1005];
int i=0;
double eval()
{double x=0,t;if(str[i]=='\0')return 0;while(str[i]==' ')i++;if(str[i]=='+'){i++;return eval()+eval();}if(str[i]=='-'){i++;return eval()-eval();}if(str[i]=='*'){i++;return eval()*eval();}if(str[i]=='/'){i++;return eval()/eval();}while(str[i]>='0'&&str[i]<='9'){x=x*10+(str[i]-'0');i++;}if(str[i]=='.'){i++;t=0.1;while(str[i]>='0'&&str[i]<='9'){x=x+(str[i]-'0')*t;t=t*t;i++;}}return x;
}
int main()
{while(gets(str)){i=0;printf("%.2f\n",eval());}return 0;
}
總結(jié)
以上是生活随笔為你收集整理的NYOJ 128 前缀式计算的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。