原题链接:剔除相关数
解题思路:我的想法比较简单,对于输入的每个数进行长度判断,如123的长度是3,23的长度是2,如果两个数的长度不相等,那么就一定不是相关数了;如果长度相等也不一定是相关数,我们还要判断该数与另一个数子字符是不是能够对应的上,如果能对应得上,那么就是相关数了,对这些数进行标记,不要输出这些数就可以了。
下面有详细的解析,有疑问欢迎留言!
注意事项:
参考代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | #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; } |
记得点赞哦!
9.9 分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复