正文

剔除相关数2007-06-22 19:08:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/lingdlz/27022.html

分享到:

剔除相关数

时间限制: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;
}

阅读(3165) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册