標籤:uva
題意:給出一個C運算式,計算其值。其中運算元只有26個字母,從a到z依次初始值為1到26;操作符有二位的 + 和二位的 - ,和正常意思一樣,然後還有一位的自增 ++ 和一位的自減 - - ,都有首碼和尾碼兩種,都和正常理解的一樣。然後計算運算式值,並給出式子中的各變數最後的值。對了,每個變數在運算式中最多隻出現一次。
思路:題目最後也有給出思路,就是將所有一位操作符即自增和自減操作符去掉,再將有首碼操作符的變數自增或自減了,然後計算運算式的值,最後將有尾碼操作符的變數自增或自減。這裡只要在輸入串中尋找自增和自減操作符就行了,遇到的是首碼的就直接修改相應變數值,遇到尾碼的進行標記下。由於題目沒有提到空格的情況,開始用gets輸入,結果WA了,說明自增或自減操作符自己中間可能有空格,然後自增或自減操作符與修飾的那個變數之間可能有空格。(可能是前者,可能後者,也可能兩者都有)所以直接getchar過濾掉空格。但又要原樣輸入運算式,只好另存了一下。
注意:空格的情況。多處都有可能有空格。
吐槽:這題好像也挺簡單的哈,但是在白書的那個專題裡,8道題目中這道UVa通過率好像最低,還以為多難的~~~~唉,資料不可信~~不可嚇自己~~
晚上還是要及時睡覺啊~就算偶爾看個精彩的比賽到一兩點,結束後就睡了吧,別破罐子破摔,搞到四五點再睡的話,休息到十二點也休息不過來了啊~~ 睡不好,幹什麼都不行,什麼都不相干,甚至連電影都懶得看,生活就會變糟~
Code:
#include<stdio.h>#include<string.h>#define MAXN 120char exp[MAXN];char ysexp[MAXN];int zm[30];int hz[30];bool flag[30];int main(){ //while(fgets(exp,MAXN-1,stdin)!=NULL) //while(gets(exp)!=NULL) char ch; while((ch=getchar())!=EOF) { int cnt=0; int yscnt=0; do { ysexp[yscnt++]=ch; if(ch!=' ') exp[cnt++]=ch; }while((ch=getchar())!='\n'); ysexp[yscnt]='\0'; exp[cnt]='\0'; printf("Expression: %s\n",ysexp); for(int i=0;i<26;++i) { zm[i]=i+1; hz[i]=0; flag[i]=0;} char *s=exp; while((s=strstr(s,"++"))!=NULL) { if(*(s+2)=='\0' || *(s+2)=='-' || *(s+2)==' ') {//尾碼 hz[*(s-1)-'a']++; *s=' '; *(s+1)=' '; } else {//首碼 zm[*(s+2)-'a']++; *s=' '; *(s+1)=' '; } //s++; } s=exp; while((s=strstr(s,"--"))!=NULL) { if(*(s+2)=='\0' || *(s+2)=='+' || *(s+2)==' ') { hz[*(s-1)-'a']--; *s=' '; *(s+1)=' '; } else { zm[*(s+2)-'a']--; *s=' '; *(s+1)=' '; } //s++; } //計算 s=exp; while(*s<'a' || *s>'z') s++;//直到*exp為小寫字母 int val=zm[*s-'a']; flag[*s-'a']=1; char c; while((c=*s)!='\0') { if(c=='+') { while(*s<'a' || *s>'z') s++;//直到*exp為小寫字母 val+=zm[*s-'a']; flag[*s-'a']=1; } else if(c=='-') { while(*s<'a' || *s>'z') s++; val-=zm[*s-'a']; flag[*s-'a']=1; } s++; } printf(" value = %d\n",val); for(int i=0;i<26;++i) if(flag[i]) { zm[i]+=hz[i]; printf(" %c = %d\n",'a'+i,zm[i]); } } return 0; }
UVa 327 計算簡單C運算式