http://acm.hdu.edu.cn/showproblem.php?pid=1237
开始看的时候头脑一团乱,想以符号为中心,然后慢慢的合并,后来实现的时候才发现太麻烦。
后来想到先处理乘除,再处理加减,把处理过的数字和未处理的符号分别放入两个数组。第二轮再取出来就行啦。
WA了好几次,才发现,<后忘记加了等于.
#include<stdio.h> #include<string.h> #define FMAX 1000 double rsearch(int* i,char num[]); main() { char num[FMAX]; char simple[FMAX]; int i,j,k,flag=0,factor,sum,s,l; double num1[FMAX]; while(gets(num),strlen(num)-1!=0||num[0]!='0') { flag=j=k=0; memset(simple,'\0',sizeof(simple)); l=strlen(num)-1; while(l<FMAX) { l++; num[l]='\0'; } for(i=0;num[i]!='\0';i++) { factor=1; sum=0; if('0'<=num[i]&&num[i]<='9') { while(num[i]!=' '&&num[i]!='\0') i++; for(s=i-1;s>=0&&num[s]!=' ';s--) { sum+=(num[s]-'0')*factor; factor*=10; } num1[j]=sum; j++; if(num[i]=='\0') break; } if(num[i]=='*') { num1[j-1]=num1[j-1]*rsearch(&i,num); if(num[i]=='\0') break; } if(num[i]=='/') { num1[j-1]=num1[j-1]/rsearch(&i,num); if(num[i]=='\0') break; } if(num[i]=='+'||num[i]=='-') { simple[k]=num[i]; k++; } } for(i=0;simple[i]!='\0';i++) { if(simple[i]=='+') { num1[i+1]+=num1[i]; flag=1; } if(simple[i]=='-') { num1[i+1]=num1[i]-num1[i+1]; flag=1; } } if(flag==1) printf("%.2lf\n",num1[i]); else printf("%.2lf\n",num1[0]); memset(num1,0,sizeof(num)); } } double rsearch(int* i,char num[]) { int j,factor=1,sum=0; *i=*i+2; while(num[*i]!=' '&&num[*i]!='\0') (*i)++; for(j=*i-1;num[j]!=' ';j--) { sum+=(num[j]-'0')*factor; factor*=10; } return sum; }