差值

描述

     输入一个整数数组,将它们连接起来排成一个数,找出能排出的所有数字中最大,最小的两个,输出两个数的差值。例如输入数组{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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值