剔除相关数
时间限制:1000MS 内存限制:65536K
Total Submit:1 Accepted:1
问题描述
一个数与另一个数如果含有相同数字和个数的字符,则称两数相关。现有一堆乱七八糟的整数,里面可能充满了彼此相关的数,请你用一下手段,自动地将其剔除。
输入
每组数据前有一个N(<1000),表示跟随的整数P(0<P<2^32)个数,若N为0,表示结束。
输出
按从小到大的顺序输出非相关数,若没有非相关数,则输出None。
输入样例
8
213 667 3 213 43 34 677 2
3
322 232 232
0
输出样例
2 3 667 677
None
// my code
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Node{
int s;
int c;
}a[1002];
void deal(struct Node *a){
char meter[10] = {0},str[12];
int i,k;
if(a->s==0){
a->c=0;
return;
}
for(i=a->s; i!=0; i/=10)
meter[i%10]++;
if(meter[0]){
for(i=1; i<10; i++){
if(meter[i])
break;
}
str[0]=i+'0';
for(k=1; meter[0]; meter[0]--,k++)
str[k] = '0';
for(meter[i]--; meter[i]; meter[i]--,k++)
str[k] = i+'0';
i++;
}
else
i = k = 0;
for(; i<10; i++)
for(; meter[i]; meter[i]--,k++)
str[k] = i+'0';
str[k]='\0';
a->c = atoi(str);
}
int myCmp(const struct Node *a,const struct Node *b){
if(a->c > b->c)
return 1;
else if(a->c < b->c)
return -1;
return 0;
}
int myCmpInt(const int *a,const int *b){
if(*a > *b)
return 1;
else if(*a < *b)
return -1;
return 0;
}
int main(){
int i,j,n,k,flag,d[1002];
while(1){
scanf("%d",&n);
if(n==0)
break;
for(i=0; i < n; i++){
scanf("%d",&a[i].s);
deal(&a[i]);
}
qsort(a,n,sizeof(struct Node),myCmp);
for(j=k=flag=0,i=1; i < n; i++){
if(a[j].c!=a[i].c && flag){
j=i;
flag=0;
}
else if(a[j].c!=a[i].c && !flag){
d[k++]=a[j].s;
j = i;
}
else
flag = 1;
}
if(k==0){
printf("None\n");
continue;
}
if(a[n-2].c != a[n-1].c)
d[k++] = a[n-1].s;
qsort(d,k,sizeof(int),myCmpInt);
for(i=0; i < k; i++)
printf("%d ",d[i]);
printf("\n");
}
return 0;
}
评论