7楼算法也很好!看来是高手啊。
#include<stdio.h> #include<string.h> #define MAX_LENGTH 240 void main() { char s[MAX_LENGTH+1],res[MAX_LENGTH+1]; /*res保存运行结果*/ char *pOut=res; /*pOut用于输出,因为最后要过滤高位的0*/ int count,i=0,j=0; scanf("%s%d",s,&count); if((unsigned)count>strlen(s)) { printf("You can\'t delete %d numbers from this string which contains only %d numbers!\n",count,strlen(s)); return; } else if((unsigned)count==strlen(s)) { printf("0\n"); return; } while(count) { while(s[i]<=s[i+1]) /*如果是升序,将s直接拷贝到res,直到遇到降序*/ res[j++]=s[i++]; i++; /*遇到降序则跳过一个字符*/ count--; /*表示成功删除一个*/ res[j]=s[i++]; while(res[j]<res[j-1]&&count) /*删掉一个书之后,往回找比下一个数大的*/ { res[j-1]=res[j]; /*从res中删掉新产生的降序数字*/ j--; count--; } i--; /*i要重新指向已拷贝的有效字符的下一个位置,要将前一个字符重新判断*/ } while((unsigned)i<strlen(s))/*若删降序时,已经删满所需数量,把s余下的部分拷贝到res中*/ res[j++]=s[i++]; while(count) { j--; count--; } /*如果还没删够,则从末尾开始删去字符*/ res[j]='\0'; while(*pOut=='0') pOut++; /*过滤高位的0*/ if(strlen(pOut)==0) /*删完之后只剩0的情况*/ printf("0\n"); else printf("%s\n",pOut); }