nyoj 1233 差值

击打开链接

差值

时间限制: 3000 ms  |  内存限制: 65535 KB
难度: 2
描述

     输入一个整数数组,将它们连接起来排成一个数,找出能排出的所有数字中最大,最小的两个,输出两个数的差值。例如输入数组{1,  2},则输出9


输入
第一行输入一个整数T,表示有T组测试数据。每组测试数据的第一行输入一个整数n(0<n<=1000),第二行输入n个整数ai(0<=ai<2^32)。
输出
输出最大数最小数的差值,每个输出各占一行。
样例输入
1
3
1 2 3
样例输出
198

思路:在排序时将两个字符串前后组合-->s1s2 ,  s2s1 比较大小 见代码


code:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include<string.h>
#include <iostream>
#define maxx 10
using namespace std;
int a[100000],b[100000],c[100000];
char * str_1 = new char[maxx*2 + 1];
char * str_2 = new char[maxx*2 + 1];

int compare(const void * str1, const void * str2)//排序函数
{
    strcpy(str_1, *(const char **)str1);
    strcat(str_1, *(const char **)str2);

    strcpy(str_2, *(const char **)str2);
    strcat(str_2, *(const char **)str1);

    return strcmp(str_1, str_2);
}

int compare1(const void * str1, const void * str2)//排序函数
{
    strcpy(str_1, *(const char **)str1);
    strcat(str_1, *(const char **)str2);

    strcpy(str_2, *(const char **)str2);
    strcat(str_2, *(const char **)str1);

    return strcmp(str_1, str_2)==-1;
}

string strsub(string str1,string str2)//大数减法
{
    int i,len1,len2,j;
    string s2="";
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        memset(c,0,sizeof(c));
        len1=str1.size();
        len2=str2.size();
        j=0;
        for(int i=len1-1;i>=0;i--)
        a[j++]=str1[i]-'0';
        j=0;
        for(i=len2-1;i>=0;i--)
        b[j++]=str2[i]-'0';

        for(i=0;i<len1;i++){
            c[i]+=(a[i]-b[i]);
            if(c[i]<0){
                c[i+1]--;
                c[i]+=10;
            }
        }
        i=len1-1;
        while(!c[i])
        {
            i--;
            if(i==-1) break;
        }
        if(i==-1)
        {
            s2="0";
            return s2;
        }
        while(i>=0)
            s2+=(c[i--]+'0');
        return s2;
    }

int sort_t(int * arr, int len)
{
    if(arr == NULL || len < 1)
        return -1;

    char ** str_x = (char **)(new int[len]);
    for(int i = 0; i < len; ++i)
    {
        str_x[i] = new char[maxx + 1];
        sprintf(str_x[i], "%d", arr[i]);
    }
    qsort(str_x, len, sizeof(char *), compare);//从小到大
    string s1="";
    for(int i = 0; i < len; ++i)
        s1+=str_x[i];

    qsort(str_x, len, sizeof(char *), compare1);//从大到小
    string s2="";
    for(int i = 0; i < len; ++i)
        s2+=str_x[i];
    cout<<strsub(s2,s1)<<endl;

    for(int i = 0; i < len; ++i)
        delete []str_x[i];
    delete []str_x;
}

int main()
{
    int n,arr[10000],cas;
    scanf("%d",&cas);
    while(cas--)
    {
        scanf("%d",&n);
    for(int i=0; i<n; i++)
        scanf("%d",&arr[i]);
    sort_t(arr, n);
    }
    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值