題意:
輸入一串只含有+和*號的表達式,可以通過添加括號來改變表達式的值,求表達式的最大最小值。
思路:
表達式中的數都是不大於20的正整數,由a*b+c<=a*(b+c)可以知道,先算乘法後算加法時表達式的值最小,
先算加法後算乘法時表達式的值最大。
由這個思路,我先把表達式中的運算符和數字都提取出來放在棧中,然後根據兩種情況進行計算。
可以寫出代碼後WA了無數次就是過不了。。。。。。
下面的AC代碼是看了別人的題解後模仿寫出的,其主要的思路是一樣,但是他用數組模擬了棧,
然後直接在從表達式中提取數據的過程中進行了計算;我覺得他思路比較巧妙的一點是,在第一個數字前
就假設了一個運算符,將第一個數字和其他的數字在形式上統一了起來,這樣大大的簡化了處理過程。
另外這個題目的結果比較大,需要用double類型來保存。
代碼如下:
#include#include #include #include using namespace std; int main() { int i,j,k,t; char str[100]; double min,max,stack[30]; scanf("%d",&t); while(t--) { scanf("%s",str); i=0; min=0;max=1.0; int top=0; char ch='+'; while(str[i]!='\0') { k=0; while(str[i]>='0'&&str[i]<='9') { k=k*10+str[i]-'0'; i++; } if(ch=='+') stack[++top]=k; else stack[top]*=k; if(str[i]!='\0') ch=str[i++]; } for(i=1;i<=top;i++) min+=stack[i]; top=0; i=0; ch='*'; while(str[i]!='\0') { k=0; while(str[i]>='0'&&str[i]<='9') { k=k*10+str[i]-'0'; i++; } if(ch=='*') stack[++top]=k; else stack[top]+=k; if(str[i]!='\0') ch=str[i++]; } for(i=1;i<=top;i++) max*=stack[i]; printf("The maximum and minimum are %0.lf and %0.lf.\n",max,min); } return 0; }
找不到錯誤的WA代碼如下:
#include#include #include #include using namespace std; int main() { char str[10000]; int i,j,k,t; double a[10000]; scanf("%d",&t); while(t--) { stack s1,s2; stack s3,s4; scanf("%s",str); double minnum=0,maxnum=1; int len=strlen(str); k=0; for(i=0;i =len) { printf("The maximum and minimum are %d and %d.\n",k,k); continue; } for(i=0;i