標籤:acm c uva 原始碼 演算法
說說:
這道題的題意就是求例如:a+b--+c++ 的值,其中a=1,b=2...依次類推。最後要求輸出整個運算式的值和每個在運算式中出現過的變數最後的值。思路其實比較簡單,先將整個運算式讀取,然後遍曆,遇到遍曆時停下,並判斷其是否有首碼++或--,並且找到該變數的運算子(如果有的話),接下來判斷是否有尾碼--或++,當然其間的空格是要忽略的。至於那些遍曆是用一個大小為26的數組儲存,沒有出現過則值為0,否則首碼或尾碼--則值為1,++則為2。最後遍曆一下數組,把結果輸出即可。總感覺這次代碼寫得好亂,嘿嘿~
原始碼:
#include <stdio.h>#include <string.h>#define MAX 110+5char express[MAX],sign;//sign為變數的運算子int prefix(int pos){//是否存在首碼 char first,i; while(pos>=0&&express[pos]!='+'&&express[pos]!='-') if(express[pos]==' ') pos--; else{ sign=0; return 0; } if(pos<0){//前面沒有+或- sign=0; return 0; } first=express[pos]; pos--; while(pos>=0&&express[pos]!=first) if(express[pos]==' ') pos--; else{ sign=first; return 0; } if(pos<0){//不存在首碼 sign=first; return 0; } pos--;//尋找變數的運算子 while(pos>=0&&express[pos]!='+'&&express[pos]!='-') if(express[pos]==' ') pos--; else{ sign=0; break; } if(pos<0) sign=0; else sign=express[pos]; if(first=='+')//++返回2 return 2; else return 1;//--返回1}int postfix(int pos){//求尾碼的方式與首碼類似 char first,i; while(pos<strlen(express)&&express[pos]!='+'&&express[pos]!='-') if(express[pos]==' ') pos++; else return 0; if(pos>=strlen(express)) return 0; first=express[pos]; pos++; while(pos<strlen(express)&&express[pos]!=first) if(express[pos]==' ') pos++; else return 0; if(pos>=strlen(express)) return 0; else if(first=='+') return 2; else return 1;}int main(){ int pos,result,i,r,add; char val[26],c; //freopen("data","r",stdin); while(gets(express)){ pos=result=0; memset(val,0,sizeof(val)); for(pos=0;pos<strlen(express);pos++) if(islower(express[pos])){ val[express[pos]-'a']=1; add=express[pos]-'a'+1;//add為結果要添加的變數值 if((r=prefix(pos-1))){ if(r==1){ add--; val[express[pos]-'a']++;//-- } else{ add++; val[express[pos]-'a']+=2;//++ } } else if((r=postfix(pos+1))){ if(r==1) val[express[pos]-'a']++; else val[express[pos]-'a']+=2; } if(sign=='-') result-=add; else result+=add; } printf("Expression: %s\n",express); printf(" value = %d\n",result); for(i=0,c='a';i<26;i++,c++) if(val[i]!=0){ if(val[i]==1) printf(" %c = %d\n",c,i+1);else if(val[i]==2) printf(" %c = %d\n",c,i);else printf(" %c = %d\n",c,i+2); } } return 0;}
Evaluating Simple C Expressions UVA 327