剔除相关数 时间限制:1000MS 内存限制:65536KTotal Submit:1 Accepted:1 问题描述 一个数与另一个数如果含有相同数字和个数的字符,则称两数相关。现有一堆乱七八糟的整数,里面可能充满了彼此相关的数,请你用一下手段,自动地将其剔除。 输入 每组数据前有一个N(<1000),表示跟随的整数P(0<P<2^32)个数,若N为0,表示结束。 输出 按从小到大的顺序输出非相关数,若没有非相关数,则输出None。 输入样例 8213 667 3 213 43 34 677 23322 232 2320 输出样例 2 3 667 677None // 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;}

评论