首先可以想到,这两个数必定是用各一半数量的数字组成的数,如给出6个数,把这6个数分为两组,每组3个,这样组成的数字的差必定比其他方式小。接下来的任务就是穷举所有可能出现的组合,并求出最小差。在这里可以使用STL的next_permutation函数来求给定这组数字的所有排列,并将其分为两组组成数字,然后记录最小差。需要注意第一个数位不能为0。
#include <iostream>
#include <algorithm>
using namespace std;
const int INF = 100000000;
int n, i, ids, a[15];
int num(int i, int j) {
int x = 0;
for(int k=i; k<j; k++) {
x *= 10;
x += a[k];
}
return x;
}
void solve() {
int ans = INF;
int k = ids / 2;
do {
if(a[0] == 0 || a[k] == 0) continue;
int x = num(0, k);
int y = num(k, ids);
ans = min(ans, abs(x - y));
} while(next_permutation(a, a+ids));
if(ids == 2)
ans = abs(a[0] - a[1]);
cout << ans << endl;
}
int main() {
scanf("%d", &n);
for(getchar(); i<n; i++) {
char c;
ids = 0;
while((c=getchar()) != '\n')
if(c != ' ')
a[ids++] = c - '0';
solve();
}
return 0;
}