原题: http://poj.org/problem?id=2718
//poj 2718 //题目大意:给你固定的n个数,用这n个数组成两个整数,求出所有情况中 两数绝对值最小的情况并输出该值。 //...没解出来,评论区说贪心不好做,用全排列,一开始我感觉全排列会超时,没想到试了全排列还真行,是自己大意了。 //注意组成的两个数不能以0为开头, #include<iostream> #include<cstdio> #include<algorithm> #include<math.h> #define qwq 0x7fffffff using namespace std; int strlen(char *str) { int i=0; while(str[i]!='\0') { i++; } return i; }int main() { int t; scanf("%d",&t); getchar(); int a[11]; while(t--) { char str[1001]; gets(str); int pos=0; //输入 int len=strlen(str); for(int i=0;i<len;i++)//将字符串转化为 整数数组 { if(str[i]>='0' && str[i]<='9') { a[pos++]=str[i]-'0'; } } //全排列 if(pos==2) //只有两个数的情况 { printf("%d\n",abs(a[1]-a[0])); continue; } int small=qwq; int yiban=pos/2; do{ if(a[0]!=0 && a[yiban]!=0){//开头不能是 0 int num1=0; int num2=0; for(int i=0;i<yiban;i++) { num1=num1*10+a[i]; } for(int i=yiban;i<pos;i++) { num2=num2*10+a[i]; } if(small>abs(num1-num2)) { small=abs(num1-num2); } } }while(next_permutation(a,a+pos)); printf("%d\n",small); } return 0; }