7-262 按1的个数排序
分数 10
作者 usx程序设计类课程组
单位 绍兴文理学院
对于给定若干由0、1构成的字符串(长度不超过80),要求将它们按1的个数从小到大排序。若1的个数相同,则按字符串本身从小到大排序。 要求至少使用一个自定义函数。
输入格式:
测试数据有多组,处理到文件尾。对于每组测试,首先输入一个整数n(1≤n≤100),然后输入n行,每行包含一个由0、1构成的字符串。
输出格式:
对于每组测试,输出排序后的结果,每个字符串占一行。
输入样例:
3
10011111
00001101
1010101输出样例:
00001101
1010101
10011111
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
// 比较函数,用于 qsort 排序
int cmp(const void* a, const void* b)
{
// 将 a 和 b 转换为 char* 类型
char* pa = *(char**)a;
char* pb = *(char**)b;
// 计算 pa 和 pb 字符串中数字的和
int cnta = 0, cntb = 0;
for(int i = 0; i < strlen(pa); i++)
cnta += pa[i] - '0';
for(int i = 0; i < strlen(pb); i++)
cntb += pb[i] - '0';
// 如果两个字符串数字和不同,按数字和排序
if(cnta != cntb)
return cnta - cntb;
// 如果两个字符串数字和相同,按字典序排序
else
return strcmp(pa, pb);
}
int main()
{
int n;
// 利用 scanf("%d", &n) != EOF 的特性实现多组数据读入
while(scanf("%d", &n) != EOF)
{
char str[110][90];
char* p[110];
// 读入 n 个字符串
for(int i = 0; i < n; i++)
{
scanf("%s", str[i]);
// 存储指向每个字符串的指针
p[i] = str[i];
}
// 对 p 数组进行排序
qsort(p, n, sizeof(char*), cmp);
// 输出排序后的结果
for(int i = 0; i < n; i++)
printf("%s\n", p[i]);
}
return 0;
}