题目52 磁盘容量排序(ok)

磁盘的容量单位有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<l<30)表示磁盘的容量,有一个或多个格式为 mv的子串组成
其中m表示容量大小 v表示容量单位
例如

磁盘容量m的范围 1~1024正整数容量单位v的范围包含题目中提到的M,G,T

输出描述:
 输出N行
 表示N块磁盘容量排序后的结果

 示例1:
 输入
     3
     1G
     2G
     1024M

 输出
    1G
    1024M
    2G

说明 1G和1024M容量相等,稳定排序要求保留他们原来的相对位置
故1G在1024M前

 示例二:
 输入
      3
      2G4M
      3M2G
      1T

  输出
    3M2G
    2G4M
    1T
    说明1T大于2G4M大于3M2G

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>

typedef struct {
    char str[32];
    int unit;
} ListStr;

int GetUnitData(char num, char *str, int begin, int len)
{
    int units = 0;
    char numStr[100] = {0};

    strncpy(numStr, str + begin, len);
    units = atoi(numStr);

    switch(num) {
        case 'M':
            break;
        case 'G':
            units = units * 1024;
            break;
        case 'T':
            units = units * 1024 * 1024;
            break;
    }

    return units;
}

int GetUnitM(char *str)
{
    int i;
    int len = strlen(str);
    int count = 0, begin = 0, sum = 0;


    for (i = 0; i < len; i++) {
        if (isdigit(str[i])) {
            count++;
        } else {
            sum += GetUnitData(str[i], str, begin, count);
            count == 0;
            begin = i + 1;
        }
    }
    // printf("sum=%d\n", sum);

    return sum;
}

int Cmp(const void *a, const void *b)
{
    ListStr *list1 = (ListStr *)a;
    ListStr *list2 = (ListStr *)b;

    return list1->unit - list2->unit;
}

int main()
{
    int i, n, idx;
    char s[100];
    ListStr list[100] = {0};

    scanf("%d", &n);
    getchar();
    for (i = 0; i < n; i++) {
        gets(list[i].str);
    }

    for (i = 0; i < n; i++) {
        list[i].unit = GetUnitM(list[i].str);
    }
    qsort(list, n, sizeof(ListStr), Cmp);
    for (i = 0; i < n; i++) {
        printf("%s\n", list[i].str);
    }

    return 0;
}

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

羊族的希望

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值