分析:分为三部分处理,第一部分找到除0外最靠右的最小数字A作为第一位;第二部分是这个最小数字A前面的数字均按规则排列,也就是每取出一张大的放在第二部分的后面,小的放在第二部分的前面;第三部分就是这个最小数A后面的数字按原顺序放在最后即可;最终即可组出新的串。
例子:9876105432。
第一部分:1
第二部分:9876,处理后为6789
第三部分:05432
最后按照第一部分,第二部分,第三部分的顺序组出新串:1678905432既是最终结果。
#include<iostream> using namespace std; int main() { int T,i,minnum,minindex,j,k; char a[105]; char b[305]; cin>>T; getchar(); while(T--) { gets(a); minnum=100; for(i=strlen(a)-1;i>=0;i--) if(a[i]<minnum && a[i]!='0') { minnum=a[i]; minindex=i; } if(minnum==100) minnum=a[0]; b[0]=minnum; j=-2; k=-1; if(strlen(a)>=2) { if(minindex!=0) { k=j=150; b[k]=a[0]; for(i=1;i<minindex;i++) if(b[k]>=a[i]) { k--; b[k]=a[i]; } else { j++; b[j]=a[i]; } } } putchar(b[0]); for(i=k;i<=j;i++) putchar(b[i]); for(i=minindex+1;i<strlen(a);i++) putchar(a[i]); cout<<endl; } return 0; }
原文地址:http://blog.csdn.net/a809146548/article/details/45439539