将01串首先按长度排序,长度相同时,按1的个数从少到多进行排序,1的个数相同时再按ASCII码值排序。
#include<stdio.h>
#include<string.h>
void change(char *x,char *y)
{
int a,i;
char c;
a=strlen(x);
if (strlen(y)>a) a=strlen(y);
for(i=0;i<a;i++)
{
c=x[i];
x[i]=y[i];
y[i]=c;
}
}
main()
{
int b[100],i,j,k,c,t,h;
char a[100];
char *d[100];
d[k]=&a[k];
while(scanf("%c",&a[k])!=EOF)
{
b[k]=strlen(d[k]);
k=k+1;
}
for(i=1;i<=k-1;i++)
{
for(j=1;j<=k-i;j++)
{
if(b[j]>b[j+1])
{
change(d[j],d[j+1]);
t=b[j];
b[j]=b[j+1];
b[j+1]=t;
}
if(b[j]==b[j+1])
{
while(b[j]!=0)
{
h=h+1;
b[j]=b[j]&(b[j]-1);
}
while(b[j+1])
{
c=c+1;
b[j+1]=b[j+1]&(b[j+1]-1);
}
if(c>h)
{
t=b[j];
b[j]=b[j+1];
b[j+1]=t;
change(d[j],d[j+1]);
}
else if(c==h)
{
if(a[j+1]<a[j])
{
t=b[j];
b[j]=b[j+1];
b[j+1]=t;
change(d[j],d[j+1]);
}
}
}
}
}
for(i=1;i<=k;i++)
{
printf("%s\n",a[i]);
}
}