题目描述
将 010101 串首先按长度排序,长度相同时,按 111 的个数多少进行排序,111 的个数相同时再按 ASCII 码值排序。
输入
输入数据中含有一些 010101 串,010101 串的长度不大于 256256256 个字符。
输出
重新排列 010101 串的顺序。使得串按基本描述的方式排序。
输入输出样例
样例输入 #1
复制
10011111
00001101
1010101
1
0
1100
样例输出 #1
复制
0
1
1100
1010101
00001101
10011111
#include<stdio.h>
#include<string.h>
#define swap(a,b) {strcpy(c,a);strcpy(a,b);strcpy(b,c);}
int main()
{
char a[256][256],c[256];
int i,j,k,m1,m2,n;
i=0;
while(scanf("%s",a[i])!=EOF) //输入
{
i++; //计数
}
for (j=0;j<i;j++)
for (k=j;k<i;k++)
{ //size_t strlen(const char *str) 计算字符串 str 的长度,直到空结束字符,但不包括空结束字符。返回字符串的长度。
if(strlen(a[j])>strlen(a[k])) //大字符组后移
{
swap(a[j],a[k]);
}
else if(strlen(a[j])==strlen(a[k]))//字符组大小相等
{
m1=0;//计算字符组a[j]中'1'数量
m2=0;//计算字符组a[k]中'1'数量
for (n=0;n<strlen(a[j]);n++)
{
if(a[j][n]=='1')
m1++;
if(a[k][n]=='1')
m2++;
}
if(m1>m2)//'1'数量多的字符组后移
{
swap(a[j],a[k]);
}
else if(m1==m2)
{
if(strcmp(a[j],a[k])>0)
{/*C 库函数 int strcmp(const char *str1, const char *str2)
把 str1 所指向的字符串和 str2 所指向的字符串进行比较。
该函数返回值如下:
如果返回值小于 0,则表示 str1 小于 str2。
如果返回值大于 0,则表示 str1 大于 str2。
如果返回值等于 0,则表示 str1 等于 str2。*/
swap(a[j],a[k]);
}
}
}
}
for (j=0;j<i;j++)
printf("%s\n",a[j]);
return 0;
}