-
描述
-
输入一个整数数组,将它们连接起来排成一个数,找出能排出的所有数字中最大,最小的两个,输出两个数的差值。例如输入数组{1, 2},则输出9。
-
输入
- 第一行输入一个整数T,表示有T组测试数据。每组测试数据的第一行输入一个整数n(0<n<=1000),第二行输入n个整数ai(0<=ai<2^32)。 输出
- 输出最大数最小数的差值,输出占一行。 样例输入
-
1 3 1 2 3
样例输出
-
198
这道题有种贪心的思想,就是将数字大的放最前面,
但是是根据每一位数字来判断的,比如:
11 110,11 112,这两种数需要考虑,所以
比较时进行循环比较,将最优的放前面,
但是好像要自己写快排。
#include <stdio.h>
#include <iostream>
#include <string.h>
const int maxn = 1005, N = 10005, M = 35;
char str[maxn][M], a[N], b[N];
inline int Max ( int a, int b ){ return a > b ? a : b; }
int cmp ( const char a[], const char b[] )
{
int la = strlen ( a ), lb = strlen ( b );
//比较需要循环比较,比如11 112(11,110),应该是112大
int len = Max ( la, lb ), i;
for ( i = 0; i < len; i ++ )
{
if ( a[i%la] == b[i%lb] )
continue ;
return a[i%la] > b[i%lb];
}
return 0;
}
void wp ( char a[], char b[] )
{
char t[N]; //交换
strcpy ( t, a );
strcpy ( a, b );
strcpy ( b, t );
}
int qsort ( int l, int r )
{
char ch[N];
strcpy ( ch, str[l] );
while ( l < r ) //自写快排
{
while ( l < r && cmp ( str[r], ch ) )
r --;
wp ( str[l], str[r] );
while ( l < r && cmp ( str[l], ch ) == 0 )
l ++;
wp ( str[l], str[r] );
}
return l;
}
void quick_sort ( int l, int r )
{
if ( l < r )
{
int pos = qsort ( l, r );
quick_sort ( l, pos-1 );
quick_sort ( pos+1, r );
}
}
void print ( int n )
{
for ( int i = 0; i < n; i ++ )
puts ( str[i] );
}
void Swap ( char str[] )
{
int j = strlen ( str )-1;
while ( j >= 1 && str[j] == '0' ) //*一个0的情况
j --;
str[j+1] = '\0'; //将后面的0去掉
for ( int i = 0; i < j; i ++, j -- )
{
char ch = str[i];
str[i] = str[j];
str[j] = ch;
}
}
void subtract ( char a[], char b[] ) //相减
{
int carry = 0, t, la = strlen ( a ), lb = strlen ( b );
int i, j, cnt = 0;
char temp[N];
for ( i = la-1, j = lb-1; i >= 0 && j >= 0; i --, j -- )
{
t = ( a[i]-'0' )-( b[j]-'0' )+carry;
carry = t < 0 ? -1 : 0;
t = ( t+10 )%10;
temp[cnt ++] = t+'0';
}
while ( i >= 0 )
{
t = ( a[i]-'0' )+carry;
carry = t < 0 ? -1 : 0;
t = ( t+10 )%10;
temp[cnt ++] = t+'0';
i --;
}
temp[cnt] = '\0';
//不会存在负号
Swap ( temp );
strcpy ( a, temp );
}
int main ( )
{
int T, n;
scanf ( "%d", &T );
while ( T -- )
{
strcpy ( a, "" );
strcpy ( b, "" );
scanf ( "%d", &n );
for ( int i = 0; i < n; i ++ )
scanf ( "%s", str[i] );
quick_sort ( 0, n-1 );
//print ( n );
for ( int i = 0; i < n; i ++ )
strcat ( b, str[i] );
for ( int i = n-1; i >= 0; i -- )
strcat ( a, str[i] );
subtract ( a, b );
puts ( a );
}
return 0;
}