题目描述
一个数与另一个数如果含有相同数字和个数的字符,则称两数相关。现有一堆乱七八糟的整数,里面可能充满了彼此相关的数,请你用一下手段,自动地将其剔除。
输入:多实例测试。每组数据包含一个n(n<1000),和n个int范围内的正整数。若n为0,表示结束。
输出:按从小到大的顺序输出非相关数,若没有非相关数,则输出None。
样例输入 Copy
8 213 667 3 213 43 34 677 2 3 322 232 232 0
样例输出 Copy
2 3 667 677 None
程序代码
#include<stdio.h>
int main()
{
int n;
while(scanf("%d",&n),n!=0){
int b[n];
for(int i=0;i<n;i++){//读入数据并存入数组b中
scanf("%d",&b[i]);
}
for(int i=0;i<n-1;i++){//将数组b按从小到大排序
for(int j=i+1;j<n;j++){
if(b[i]>b[j]){
int s=b[j];
b[j]=b[i];
b[i]=s;
}
}
}
for(int k=0;k<n-1;k++){
int sum=0,bum=1;//sum计算元素各个位数之和,bum计算元素各个位数乘积
int e=b[k];
while(e!=0){
sum+=(e%10);
bum*=(e%10);
e/=10;
}
for(int l=k+1;l<n;l++){
int sum1=0,bum1=1;//sum1计算元素各个位数之和,bum1计算元素各个位数乘积
int r=b[l];
while(r!=0){
sum1+=(r%10);
bum1*=(r%10);
r/=10;
}
if(sum==sum1&&bum==bum1){//当两个数的各个位数之和相等并且各个位数的乘积也相等时,这两个数就满足相关,将两个数都赋值为0
b[k]=0;
b[l]=0;
}
}
}
int flag=0;//flag为标记数
for(int i=0;i<n;i++){
if(b[i]!=0){//当数组中元素值不为0即输出该元素
printf("%d ",b[i]);
flag=1;//同时flag赋为1
}
}
if(flag==0) printf("None");//当flag为0说明没有非相关数,那么就输出None
printf("\n");//每完成一个案例测试就换行
}
return 0;
}