差值 NYOJ1233 思路+代码

差值

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

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


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


思路:

这个题目比较有意思,不是纯粹的模板题,夙瑶需要对输入进行数据处理。难点为排序算法,应该清楚不是数值大的排前面而是字典序最大的排前 ,这里可以用到strcmp()进行比较,排完序进行一个简单的大数减法操作就行了,不推荐用模板,因为这两个相减的数数位相同,大小关系已知,很简单的操作。最后注意处理前导零就行了。

编程最重要的还是细心。

#include<bits/stdc++.h>
using namespace std;
char c[50001];
char s[50001];

int n;
struct zz
{
    char s[50];
}q[1050];
int cmp(zz a,zz b)//字典序进行排序
{
    return strcmp(strcat(a.s,b.s),strcat(b.s,a.s))<0;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(q,0,sizeof(q));
        memset(s,0,sizeof(s));
        memset(c,0,sizeof(c));
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            scanf("%s",q[i].s);
        }

        sort(q,q+n,cmp);

        int z=0,p=0;
        for(int i=0,j=n-1;i<n&&j>=0;j--,i++)
        {
             strcat(c,q[i].s);//最小
             strcat(s,q[j].s);//最大

        }

        int l=strlen(c);
        for(int i=l-1;i>=0;i--)
        {
            if(s[i]-c[i]<0)
            {
                --s[i-1];
                s[i]+=10;
            }
           s[i]=s[i]-c[i]+'0';

        }

       int y=0;
       for(;y<l;y++)
       {
           if(s[y]!='0'){puts(s+y);break;}
       }
       if(y==l) printf("0\n");

    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值