103 分割数字并排序

问题描述 :

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

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

 

输入说明 :

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

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

 

输出说明 :

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

 

输入范例 :

2
0051231232050775
4000050005045453356356456454564567677686564654

输出范例 :

0 77 12312320
0 4 4 4 4 33 63 64 64 64 646 40000 67677686

 

思想:用字符存储,然后根据规则进行存入数字,详见注释。

复制代码
#include <stdio.h>
#include <string.h>

int main()
{
    int i, j, k,l;
    int num;
    char s[1000];
    scanf("%d", &num);
    for (l = 0; l < num; l++)
    {
        if(l==0){
            getchar();  //首行吸收一下换行符
        }
        gets(s);
        int nums[30] = {0};
        int isStart = 1;  //记录是否是开头数字
        int flag = 0;  //记录是否以0开始且以5结尾
        k = 0;
        for (j = 0; j <strlen(s); j++)
        {
            if(isStart)  //是开头数字
            {
                if (s[j] == '5')   //遇到结尾了
                {
                    if(flag){  //如果以0开头,没有其他有效数字
                        nums[k++] = 0;  //更新一个0进去
                        flag = 0;
                    }else{
                        continue;
                    }
                }
                else if(s[j]=='0'){
                    flag =1;
                    if(j==strlen(s)-1){  //如果最后一个字符就是000这种,处理一下,把nums最后更新为0,更新一下位数
                        nums[k++] = 0;
                    }
                }
                else{
                    flag = 0;
                    nums[k] = s[j] - 48;
                    isStart = 0;
                    if(j==strlen(s)-1){ //如果最后一个字符是单数字,处理一下,把nums的位数更新一下
                        k++;
                    }
                }
            }
            else  //不是开头数字
            {
                if (s[j] == '5')  //结尾
                {
                    isStart = 1; 
                    k++;
                    continue;
                }
                else  //更新当前数字
                {
                    nums[k] = nums[k] * 10 + s[j] - 48;
                    if(j==strlen(s)-1){  //如果是最后一位数,那么要更新一下位数
                        k++;
                    }
                }
            }
        }  
        //冒个序
        for (i = 0; i <k; ++i) //比较n-1轮
            {
                for (j = 0; j <k - 1 - i; ++j) //每轮比较n-1-i次,
                {
                    if (nums[j] > nums[j + 1])
                    {
                        int temp = nums[j];
                        nums[j] = nums[j + 1];
                        nums[j + 1] = temp;
                    }
                }
            }
            printf("%d",nums[0]);
            for(i=1;i<k;i++){
                printf(" %d",nums[i]);
            }
            printf("\n");
    }
}
复制代码

 

posted @   梦想是能睡八小时的猪  阅读(91)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示