生活随笔
收集整理的這篇文章主要介紹了
NYOJ 128 前缀式计算
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前綴式計算
時間限制:
1000?ms ?|? 內存限制:
65535?KB 難度:
3
描述
先說明一下什么是中綴式:
如2+(3+4)*5這種我們最常見的式子就是中綴式。
而把中綴式按運算順序加上括號就是:(2+((3+4)*5))
然后把運算符寫到括號前面就是+(2 *( +(3 4) 5) )
把括號去掉就是:+ 2 * + 3 4 5
最后這個式子就是該表達式的前綴表示。
給你一個前綴表達式,請你計算出該前綴式的值。
比如:
+ 2 * + 3 4 5的值就是 37
輸入有多組測試數據,每組測試數據占一行,任意兩個操作符之間,任意兩個操作數之間,操作數與操作符之間都有一個空格。輸入的兩個操作數可能是小數,數據保證輸入的數都是正數,并且都小于10,操作數數目不超過500。
以EOF為輸入結束的標志。輸出對每組數據,輸出該前綴表達式的值。輸出結果保留兩位小數。樣例輸入 + 2 * + 3 4 5
+ 5.1 / 3 7 樣例輸出 37.00
5.53 AC碼: // 調用庫函數,遞歸#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字符串轉換成double;//atoi在stdlib.h中的把str字符串轉換成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;
}
總結
以上是生活随笔為你收集整理的NYOJ 128 前缀式计算的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。