NYOJ 题目465

最大值和最小值

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 1
描述
小明在上C语言课时老师布置了一道编程作业,要求是给你一个数(数的长度小于100)让你求出由该数的数字组成的最大值和最小值,由于小明编程学的不好但为了完成作业,想请你帮助他。
输入
第一行输入一个数N(0<N<=100),表示有N组测试数据。接下来的N行每行输入一个数M。
输出
每组输出占一行,输出由M的数字组成的最大值和最小值,并且最大值和最小值之间用空格隔开。
样例输入
2
12345045789123
899000124
样例输出
98755443322110 1122334455789
998421000 124899
这道题的思路很明确,字符数组输入,然后分别用两个整形的数组存放数据,之后对两个数组排序,排序最大值的数组中零要存放,排序最小值的数组中零不要存放。同时如果输入的全是零,输出格式只需为0 0就可以,可以用一个变量统计零的个数,然后看零的个数是否与输入的位数相同。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
int comp1(const void*a,const void*b)
{
    return *(int*)b-*(int*)a;
}
int comp2(const void*a,const void*b)
{
    return *(int*)a-*(int*)b;
}
int main()
{
    int n,i,j,k,z,Len1,t,sum;
    int number1[120]={0},number2[120]={0};
    char s[120];
    scanf("%d",&n);
    for(z=0;z<n;z++)
    {
        scanf("%s",s);
        Len1=strlen(s);
        for(i=0,j=0,k=0,sum=0;i<Len1;i++)
        {
            t=s[i]-'0';
            if(t!=0)
            {
                number1[k]=t;
                number2[j]=t;
                j++;
                k++;
            }
            if(t==0)
            {
                number1[k]=t;
                k++;
                sum++;
            }
        }
        if(sum==Len1)/*考虑输入全是零的情况,输入全是零,最大最小值输出0 0*/
        {
            printf("0 0\n");
            continue;
        }
        qsort(number1,k,sizeof(int),comp1);
        qsort(number2,j,sizeof(int),comp2);
        for(i=0;i<k;i++)
        {
            if(i!=(k-1))
                printf("%d",number1[i]);
            if(i==(k-1))
                printf("%d ",number1[i]);
        }
        for(i=0;i<j;i++)
        {
            if(i!=(j-1))
                printf("%d",number2[i]);
            if(i==(j-1))
                printf("%d",number2[i]);
        }
        printf("\n");
    }
    return 0;
}

发布了45 篇原创文章 · 获赞 1 · 访问量 6792

猜你喜欢

转载自blog.csdn.net/Ls_attack/article/details/75244336