NYOJ 1233 差值

来源:互联网 发布:笔筒淘宝 编辑:程序博客网 时间:2024/05/17 18:43

差值

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

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

输入

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

输出

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

样例输入

131 2 3
样例输出
198
上传者

ZWZ530

开始没看清题,用整形数据进行排序,再读读题原来每个数据不一定都是一位。然后又重新开始写,这道题跟大数减法不太一样的是不能逆序存储然后从0到结尾进行减法计算,要直接从len到0进行减法,a2存的是大的那个数,a1是小的那个。看看代码吧。

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;struct str{    char s[25];//每个数ai(0<=ai<2^32),即每个数都不一定是一位,整型存储起来比较麻烦,这里直接用字符数组来存数据}sub[1005];bool cmp(str a,str b)  //学学排序 {    int i;    int len1=strlen(a.s);    int len2=strlen(b.s);    int x=max(len1,len2);    for(i=0;i<x;i++)    {        if(a.s[i%len1]<b.s[i%len2])            return 1;        else if(a.s[i%len1]>b.s[i%len2])            return 0;    }    return 1;}int main(){    int t,len,i,j,n;    char s[20050];    int a1[20050],a2[20050],c[20050];    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        for(i=0;i<n;i++)            scanf("%s",sub[i].s);        sort(sub,sub+n,cmp);   //排序比较有特点,例如 25 36 8 2 排序后为2 25 36 8         memset(s,0,sizeof(s));        for(i=0;i<n;i++)              strcat(s,sub[i].s);       // puts(s);        len=strlen(s);        for(j=0,i=0;i <len;i++)            a1[j++]=s[i]-'0';  //存到整型数组中         memset(s,0,sizeof(s));        for(i=n-1;i>=0;i--)              strcat(s,sub[i].s);       // puts(s);        for(j=0,i=0;i<len;i++)              a2[j++]=s[i]-'0';        memset(c,0,sizeof(c));        for(i=len - 1;i>=0;i--)        {        if(a2[i] >= a1[i])        c[i] = a2[i] - a1[i];            else            {                c[i] = a2[i] + 10 - a1[i];                a2[i - 1] --;            }         //   printf("%d **  %d\n",c[i],a1[i + 1]);        }        for(i=0;i<len;i++)            if(c[i])break;        if(i==len)                 printf("0");        for(;i < len;i++)            printf("%d",c[i]);        printf("\n");    }    return 0;}        

0 0
原创粉丝点击