Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:两个月后终于把它给AC了,字符串处理稍微烦点,要考虑手写算式的多种可能情况,贴代码In Reply To:Re:题目有多组解啊。。。即使采用+<-<*还是会tie,怎么没special judge呢。。。。 Posted by:linkedQueue at 2009-03-24 15:43:45 # include <stdio.h> # include <stdlib.h> # include <string.h> int posnum; typedef struct { char operator; int layer; }atom; void init(char line[]) { int i; for(i=0;i<strlen(line);i++) if(line[i]=='=') { strcpy(line,line+1+i); break; } for(i=0;i<strlen(line);i++) { if(line[i]=='(') { while(line[i+1]==' ') strcpy(line+i+1,line+i+2); } if(line[i]==')') { while(line[i-1]==' ') strcpy(line+i-1,line+i),i--; } } char templine[1024],*pos; strcpy(templine,strtok(line," ")); while(pos=strtok(NULL," ")) { strcat(templine," "); strcat(templine,pos); } strcpy(line,templine); for(i=0;i<strlen(line);i++) { if(line[i]==')'&&line[i+1]!=')'&&line[i+1]!=' '&&line[i+1]!='\0') { int j; for(j=strlen(line)+1;j>i+1;j--) line[j]=line[j-1]; line[i+1]=' '; } } for(i=0;i<strlen(line);i++) { if(line[i]>='0'&&line[i]<='9'&&line[i+1]=='(') { int j; for(j=strlen(line)+1;j>i+1;j--) line[j]=line[j-1]; line[i+1]=' '; } } } int sub_cul(int a,int b,char operator) { switch(operator) { case '+':return a+b;break; case '-':return a-b;break; case '*':return a*b;break; }; } int cul(char line[]) { int layer=0; atom stack2[1024]; int stack1[1024]; int top1=-1,top2=-1; int i; for(i=0;i<strlen(line);i++) { if(line[i]>='0'&&line[i]<='9') { int temp=line[i]-48; while(line[i+1]>='0'&&line[i+1]<='9') { i++; temp=temp*10+line[i]-48; } stack1[++top1]=temp; } else if(line[i]=='(') layer++; else if(line[i]==')') layer--; else { if(top2>=0&&layer<=stack2[top2].layer) { while(top2>=0&&layer<=stack2[top2].layer) { int result=sub_cul(stack1[top1-1],stack1[top1],stack2[top2].operator); top1--; stack1[top1]=result; top2--; } stack2[++top2].layer=layer; stack2[top2].operator=line[i]; } else { stack2[++top2].layer=layer; stack2[top2].operator=line[i]; } } } while(top2!=-1) { stack1[top1-1]=sub_cul(stack1[top1-1],stack1[top1],stack2[top2--].operator); top1--; } return stack1[0]; } int deal(char line[],int pos) { if(line[pos]=='\0') { if(cul(line)==posnum) return 1; else return 0; } else if(line[pos]!=' ') return deal(line,pos+1); else { line[pos]='+'; if(deal(line,pos+1)) return 1; line[pos]='-'; if(deal(line,pos+1)) return 1; line[pos]='*'; if(deal(line,pos+1)) return 1; line[pos]=' '; return 0; } } int main() { char line[1024]; int count=1; while(1) { gets(line); char templine[1024]; strcpy(templine,line); if(!strcmp(line,"0")) break; posnum=atoi(strtok(templine,"=")); init(line); printf("Equation #%d:\n",count++); if(deal(line,0)) printf("%d=%s\n\n",posnum,line); else printf("Impossible\n\n"); } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator