原题链接:剔除相关数
解题思路:我的想法比较简单,对于输入的每个数进行长度判断,如123的长度是3,23的长度是2,如果两个数的长度不相等,那么就一定不是相关数了;如果长度相等也不一定是相关数,我们还要判断该数与另一个数子字符是不是能够对应的上,如果能对应得上,那么就是相关数了,对这些数进行标记,不要输出这些数就可以了。
下面有详细的解析,有疑问欢迎留言!
注意事项:
参考代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n; //数字个数
const int maxn=10001;
int Length(int n){ /*每个数的长度 如100长度是3*/
int len=0;
while(n){
n/=10;
len++;
}
return len;
}
int Equal(int n,int m){ /* 判断每两个数的是否相等*/
int M[21],N[21]; //保存两个数分解出来的数
int t=0,k=0;
while(n){ /*因为长度是相等的,所以只要一个数满足不为零就可以了*/
N[t]=n%10;
M[t++]=m%10;
n/=10;
m/=10;
}
sort(N,N+t); /*进行从小到大排序*/
sort(M,M+t);
for(int i=0;i<t;i++){ /*如果两个数分解出来的数不相等 说明两个数不相关*/
if(N[i]!=M[i])
return 0;
}
return 1; /*两个数相等,返回真*/
}
int main(){
while(cin>>n&&n){
int a[maxn];
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n); /*进行从小到大排序,主要方便输出*/
int Len[maxn],flag[maxn]; /*Len[] 保存每个数的长度,flag[]对相关数进行标记*/
memset(Len ,0 ,sizeof(Len)); /*数组清零*/
memset(flag ,0 ,sizeof(flag)); /*数组清零*/
for(int i=0;i<n;i++){
Len[i]=Length(a[i]); /*求每个数的长度*/
}
for(int i=0;i<n;i++){ /*暴力解题*/
for(int j=i+1;j<n;j++){
if(Len[i]==Len[j]){ /*长度不相等就跳过了*/
if(Equal(a[i],a[j])){ /*满足相关数进行标记*/
flag[i]=1;
flag[j]=1;
}
}
}
}
int Ans=0; /*用来判断是不是有些数不是相关数*/
for(int i=0;i<n;i++){
if(flag[i]==0){
cout<<a[i]<<" ";
Ans++;
}
}
if(Ans==0)
cout<<"None";
cout<<endl;
}
return 0;
}记得点赞哦!
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复