牛客网题目:磁盘容量排序(C语言)

磁盘容量排序 | 时间限制:1 秒 | 内存限制:262144K | 语言限制:不限
磁盘的容量单位常用的有 M,G,T 这三个等级,它们之间的换算关系为 1T = 1024G,1G = 
1024M,现在给定 n 块磁盘的容量,请对它们按从小到大的顺序进行稳定排序,例如给定 5
块盘的容量,1T,20M,3G,10G6T,3M12G9M 排序后的结果为 20M,3G,3M12G9M,1T,
10G6T。注意单位可以重复出现,上述 3M12G9M 表示的容量即为 3M+12G+9M,和 12M12G
相等。
输入描述:
输入第一行包含一个整数 n(2 <= n <= 100),表示磁盘的个数,接下的 n 行,每行一个字符串
(长度大于 2,小于 30),表示磁盘的容量,由一个或多个格式为 mv 的子串组成,其中 m 表
示容量大小,v 表示容量单位,例如 20M,1T,30G,10G6T,3M12G9M。
磁盘容量 m 的范围为 1 到 1024 的正整数,容量单位 v 的范围只包含题目中提到的 M,G,
T 三种,换算关系如题目描述。
输出描述:
输出 n 行,表示 n 块磁盘容量排序后的结果。
示例 1
输入
3
1G
2G
1024M
输出
1G
1024M
2G
说明
1G 和 1024M 容量相等,稳定排序要求保留它们原来的相对位置,故 1G 在 1024M 之前
示例 2
输入
3
2G4M
3M2G1T
输出
3M2G
2G4M
1T
说明
1T 的容量大于 2G4M,2G4M 的容量大于 3M2G

代码如下:

**************************************************代码分界线********************************************

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include <stdio.h>
#include<math.h>
void main()
{
    int n;
    char disk[100][30];
    scanf("%d", &n);
    int i, j;
    for (i = 0; i < n; i++)
    {
        scanf("%s", disk[i]);
    }
    int count[100][3],sum,si;
    for (i = 0; i < n; i++)
    {
        count[i][0] = 0;
        count[i][1] = 0;
        count[i][2] = 0;
    }
    for (i = 0; i < n; i++)
    {
        sum = 0;
        for (j = 0; disk[i][j] != '\0'; j++)
        {
            if (isdigit(disk[i][j]))
            {
                si = disk[i][j] - 48;
                sum = sum * 10 + si;
            }
            if (isalpha(disk[i][j]))
            {
                if (disk[i][j] == 'M')
                {
                    count[i][0] = count[i][0] + sum;
                    if (count[i][0] == 1024)
                    {
                        count[i][0] = 0;
                        count[i][1]++;
                    }
                    sum = 0;
                }
                if (disk[i][j] == 'G')
                {
                    count[i][1] = count[i][1] + sum;
                    if (count[i][1] == 1024)
                    {
                        count[i][1] = 0;
                        count[i][2]++;
                    }
                    sum = 0;
                }
                if (disk[i][j] == 'T')
                {
                    count[i][2] = count[i][2] + sum;
                    sum = 0;
                }

            }
        }
    }
    int chan,k;
    char ch;
    for (i = 0; i < n; i++)
    {
        for (j = i+1; j < n; j++)
        {
            if (count[i][2] > count[j][2])
            {
                chan = count[i][2];
                count[i][2] = count[j][2];
                count[j][2] = chan;
                chan = count[i][1];
                count[i][1] = count[j][1];
                count[j][1] = chan;
                chan = count[i][0];
                count[i][0] = count[j][0];
                count[j][0] = chan;
                for (k = 0; k < 30; k++)
                {
                    ch = disk[i][k];
                    disk[i][k] = disk[j][k];
                    disk[j][k] = ch;
                }
            }
            else if (count[i][2] == count[j][2])
            {
                if (count[i][1] > count[j][1])
                {
                    chan = count[i][2];
                    count[i][2] = count[j][2];
                    count[j][2] = chan;
                    chan = count[i][1];
                    count[i][1] = count[j][1];
                    count[j][1] = chan;
                    chan = count[i][0];
                    count[i][0] = count[j][0];
                    count[j][0] = chan;
                    for (k = 0; k < 30; k++)
                    {
                        ch = disk[i][k];
                        disk[i][k] = disk[j][k];
                        disk[j][k] = ch;
                    }
                }
                else if (count[i][1] == count[j][1])
                {
                    if (count[i][0] > count[j][0])
                    {
                        chan = count[i][2];
                        count[i][2] = count[j][2];
                        count[j][2] = chan;
                        chan = count[i][1];
                        count[i][1] = count[j][1];
                        count[j][1] = chan;
                        chan = count[i][0];
                        count[i][0] = count[j][0];
                        count[j][0] = chan;
                        for (k = 0; k < 30; k++)
                        {
                            ch = disk[i][k];
                            disk[i][k] = disk[j][k];
                            disk[j][k] = ch;
                        }
                    }
                }
            }
        }
    }
    for (i = 0; i < n; i++)
    {
        printf("%s\n", disk[i]);
    }
}

**************************************************代码分界线********************************************

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值