http://acm.hdu.edu.cn/showproblem.php?pid=1106 思路: 要注意前5,中间连5和后5的情况。 其他的和精度运算得出操作数的方式相似。 #include<stdio.h> #include<algorithm> #include<string> using namespace std; struct S { char m[1003]; }; S s[1003]; char x[1003]; bool cmp(S m1,S m2) { int i; if((int)strlen(m1.m)<(int)strlen(m2.m)) return true; else if((int)strlen(m1.m)>(int)strlen(m2.m)) return false; else { for(i=0;i<(int)strlen(m1.m);i++) { if(m1.m[i]<m2.m[i])return true; else if(m1.m[i]>m2.m[i])return false; } } return true; } int main() { int i,j,start,end; bool flg; while(scanf("%s",x)!=EOF) { flg=true; start=end=-1; for(i=0,j=0;i<(int)strlen(x);i++) { if(x[i]=='5') { if(start==-1) //前5,多5 continue; if(flg) //0000 { start=i-1; } end=i-1; strncpy(s[j++].m,x+start,end-start+1); start=end=-1; flg=true; } else if(x[i]=='0') //052 { if(flg) { start=i+1; } } else { if(flg) //77 { flg=false; start=i; } } } if(x[i-1]!='5') //后5 { if(flg) start=i-1; strncpy(s[j++].m,x+start,(int)strlen(x)-start); } sort(s,s+j,cmp); for(i=0;i<j;i++) { if(i==0) printf("%s",s[i].m); else printf(" %s",s[i].m); } printf("/n"); for(i=0;i<1003;i++) //clear memset(s[i].m,0,1003); memset(x,0,1003); } return 0; }