分析:分为三部分处理,第一部分找到除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