【nyoj-1233】差值

描述

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

 
 

输入

第一行输入一个整数T,表示有T组测试数据。每组测试数据的第一行输入一个整数n(0<n<=1000),第二行输入n个整数ai(0<=ai<2^32)。

输出

输出最大数最小数的差值,输出占一行。

样例输入

1
3
1 2 3

样例输出

198
大整数减法,关键是想好如何排序。排序规则是比较s1+s2和s2+s1的大小。
#include <bits/stdc++.h>
using namespace std;
const int N = 21000;
struct node
{
    char s[20];
} q[1015];
int a[N], b[N];
bool gminus(int *a,int *b)
{
    for(int i = 1; i <= a[0]; i++)
    {
        if(a[i]<b[i])
        {
            a[i+1]--;
            a[i]+=10;
        }
        a[i]=a[i]-b[i];
    }
    while(a[a[0]]==0&&a[0]) a[0]--;
    if(!a[0]) return 0;
    return 1;
}
int cmp(node a,node b)
{
    int la=strlen(a.s);
    int lb=strlen(b.s);
    int l=max(la,lb);
    for(int i=0; i<l; i++)
    {
        if(a.s[i%la]<b.s[i%lb])
            return 1;
        else if(a.s[i%la]>b.s[i%lb])
            return 0;
    }
    return 1;
}
int main()
{
    int t, n;
    cin>>t;
    while(t--)
    {
        scanf("%d", &n);
        for(int i = 0; i < n; i++) scanf("%s", q[i].s);
        sort(q, q+n, cmp);
        char s[N];
        memset(s, 0, sizeof s);
        for(int i = 0; i < n; i++)
            strcat(s, q[i].s);
        int num = 0, l = strlen(s);
        for(int i = l-1; i >= 0; i--)
            b[++num] = s[i]-'0';
        b[0] = num, num = 0;
        memset(s, 0, sizeof s);
        for(int i = n-1; i >= 0; i--)
            strcat(s, q[i].s);
        for(int i = l-1; i >= 0; i--)
            a[++num] = s[i]-'0';
        a[0] = num;
        bool f = gminus(a, b);
        if(!f) printf("0");
        else
            for(int i = a[0]; i>=1; i--)
                printf("%d", a[i]);
        cout<<endl;
    }
    return 0;
}
posted @ 2018-06-21 21:38  LesRoad  阅读(358)  评论(0编辑  收藏  举报