题意:数字排序组成两个数,求最小差值。
思路:
next_permutation函数的应用,历遍把数组所有的可能排列顺序。
为求最小差值,分割数组时应使两个数的位数差尽可能小(为1),选取中间值mid为第二个数的开头。
AC代码:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int num[10];
int main()
{
int t,i,k;
char ch;
scanf("%d",&t);
getchar();
while(t--)
{
k=0;
while((ch=getchar())!='\n'){
if(ch>='0' && ch<='9') num[k++]=ch-'0';
}
if(k==2) //处理只有两个数的情况
{
printf("%d\n",num[1]-num[0]);
continue;
}
int ans=999999999;
do
{
if(num[0]==0) continue;
int mid=(k+1)/2; //找到第二个数的开头
if(num[mid]) //第二个数不能以零开头
{
int a=0,b=0;
for(i=0;i<mid;i++)
a=a*10+num[i];
for(i=mid;i<k;i++)
b=b*10+num[i];
ans=min(ans,abs(b-a));
}
}while(next_permutation(num,num+k));
printf("%d\n",ans);
}
return 0;
}