磁盘容量排序 | 时间限制: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]);
}
}
**************************************************代码分界线********************************************