磁盘的容量单位有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;
}