您的位置:首页 > 其它

杭电oj-1106-排序

2015-11-02 21:48 281 查看
Problem Description

输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。

你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。

Input

输入包含多组测试用例,每组输入数据只有一行数字(数字之间没有空格),这行数字的长度不大于1000。  

输入数据保证:分割得到的非负整数不会大于100000000;输入数据不可能全由‘5’组成。

Output

对于每个测试用例,输出分割得到的整数排序的结果,相邻的两个整数之间用一个空格分开,每组输出占一行。

Sample Input

0051231232050775

 

Sample Output
0 77 12312320

思路分析:这道题题意很好理解,难的地方是怎么把这些数分离出来。主要有三种情况考虑,前边有好多连续个‘5’,中间有好多连续个‘5’,以及最后面有好多连续个‘5’。对于中间和后面有很多个‘5’的情况很好处理,只用正序循环和逆序循环找到第一个部位‘5’的位置就可以了,对于中间的‘5’,我们采用逆循环,然后当其下标为i和下标i-1的都为‘5’时,我们将下标为i的赋值为‘0’。为什么要赋值为‘0’呢?这是因为对于中间连续的‘5’我们只取第一个,将后面的改为‘0’,在逆循环计算数值时是不变的。

例如 555123455523455555

经过处理后可得到 1234500234

得到的数还是       234    1234

然后我们从最后一个补位‘5’的一直算到第一个不为‘5’的地方,每算出一个数,就将其依次存进新的数组中,然后sort排序即可

代码如下:

#include <algorithm>

#include <iostream>

#include <stdio.h>

#include <string.h>

#include <math.h>

using namespace std;

char s[1005];

long long int a[1005];

//计算10的n次方

long long int cifang(int i)

{

    int sum=1;

    if(i==0)

        return sum;

    else

    {

        while(i>0)

        {

            sum*=10;

            i--;

        }

        return sum;

    }

}

int main()

{

    //字符数组初始化

    memset(s,0,sizeof(s));

    while(scanf("%s",s)!=EOF)

    {

        //新数组清零

        memset(a,0,sizeof(a));

        int l1;

        l1=strlen(s);

        int l2,l3;

        //逆循环找出最后一个不为‘5’的下标

        for(int i=l1-1;i>=0;i--)

            if(s[i]!='5')

            {

                l2=i;

                break;

            }

        //正循环找出最后一个不为‘5’的下标

        for(int i=0;i<=l2;i++)

            if(s[i]!='5')

            {

                l3=i;

                break;

            }

        //逆循环对中间有连续个‘5’的情况进行处理

        for(int i=l2;i>l3;i--)

            if(s[i]=='5'&&s[i-1]=='5')

                s[i]='0';

        //逆循环依次进行计算

        int jishu=0;//表示第几位

        int k=0;//表示新数组下标

        long long sum=0;//表示数值

        for(int i=l2;i>=l3;i--)

        {

            //因为最后一个数最高位不为‘5’,所以单独讨论

            if(i==l3)

            {

                a[k]=sum+(s[i]-'0')*cifang(jishu);

                k++;

                jishu=0;

                sum=0;

            }

            //每当遇到‘5’时,表明这个数已经计算完了,放入新的数组中

            if(s[i]=='5')

            {

                a[k]=sum;

                k++;

                sum=0;

                jishu=0;

            }

            //没有遇到‘5’,表明数字没有计算完

            else

            {

                sum+=(s[i]-'0')*cifang(jishu);

                jishu++;

            }

        }

        //对所得的数进行排序

        sort(a,a+k);

        //输出

        for(int i=0;i<k-1;i++)

            printf("%d ",a[i]);

        printf("%d",a[k-1]);

        printf("\n");

        //字符数组初始化

        memset(s,0,sizeof(s));

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: