本题题意是把所给数分为两个非空集合,分别用这两个集合组成两个数,求组成数的最小绝对值。很快我们便能想到next_permutation()这个C++标准库函数。next_permutation(data,data+n)的功能把data[0]到data[n-1]的所有可能情况枚举出来。本题中,我们可以先将所有数字一一枚举,从中挑选出符合条件的分组做处理。原题链接
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int main(){
int n,sum1,sum2,result;
int data[10];
cin>>n;
while(n--){
char c,s;
int k=0;
result=0x7f7f7f7f;
memset(data,0,sizeof(data));
while(cin>>skipws>>c>>noskipws>>s){
data[k++]=c-'0';
if(s=='\n') break;
}
sort(data,data+k);
while(next_permutation(data,data+k)){ ///枚举数据的各种情况
int i;
sum1=sum2=0;
if(!data[k/2]&&k>2||!data[0]&&k>3) continue; ///【重要】排除首位数为0的情况
for(i=0;i<k/2;i++) sum1=sum1*10+data[i]; ///计算第一个数
for(;i<k;i++) sum2=sum2*10+data[i]; ///计算第二个数
result=min(result,abs(sum1-sum2)); ///更新结果
}
cout<<result<<endl;
}
return 0;
}