原题链接:剔除相关数
解题思路:
使用STL中的set集合。可以自动排序,并保证不重复插入。
(1)先定义一个转换函数change()实现:把原来输入的整数x里面的数字的重新从小到大排列组合成新的整数,并返回重新排列之后的整数。
(2)这一题用了两个集合s1,s2;
(3)s1保存的是插入的原整数x转换后的整数y。
(4)s2保存的是插入的整数x,并保证剔除相关数。
(5)通过判断把转换数y是否成功插入到集合s1来决定,是否把原数x插入到集合s2中;
(6)如果y成功插入到s1中,说明没有相关数,则把原数x插入到s2中;否则插入不成功,同时要从集合s2中剔除相关数。
参考代码:
//难点在于如何判断把x插入到集合s1中是否成功,如果不成功,则说明插入的x是某一个数的相关数,此时要把 //集合s2中的相关数剔除。我是判断插入前后的长度是否增加来判断插入是否成功的。 #include<bits/stdc++.h> using namespace std; int change(int x) //转换函数,把整数x里面数字的重新从小到到排列,赋值给y,返回重新排列之后的整数 { int y; char temp[20]; sprintf(temp,"%d",x); sort(temp,temp+strlen(temp)); sscanf(temp,"%d",&y); return y; } int main() { int n; while(cin>>n && n) { int x,y; set<int> s1,s2; for(int i=0;i<n;i++) { cin>>x; y=change(x); int len=s1.size(); s1.insert(y); if(s1.size()>len) //插入成功,长度增加1,所以长度大于插入之前的长度 s2.insert(x); else //插入不成功,说明有重复的 { set<int>::iterator it; for(it=s2.begin();it!=s2.end();it++) //遍历集合s2,把重复的删除 { int num=change(*it); if(y==num) { s2.erase(it); break; } } } } if(s2.size()==0) { cout<<"None"<<endl; } else { set<int>::iterator it1; for(it1=s2.begin();it1!=s2.end();it1++) cout<<*it1<<" "; cout<<endl; } } return 0; }
//难点在于如何判断把x插入到集合s1中是否成功,如果不成功,则说明插入的x是某一个数的相关数,此时要把 //集合s2中的相关数剔除。通过查询发现可以用另外的方式判断插入是否成功。 #include<bits/stdc++.h> using namespace std; int change(int x) //转换函数,把整数x里面数字的重新从小到到排列,赋值给y,返回重新排列之后的整数 { int y; char temp[20]; sprintf(temp,"%d",x); sort(temp,temp+strlen(temp)); sscanf(temp,"%d",&y); return y; } int main() { int n; while(cin>>n && n) { int x,y; set<int> s1,s2; for(int i=0;i<n;i++) { cin>>x; y=change(x); pair<set<int>::iterator, bool> pair1; pair1 = s1.insert(y); if(pair1.second) //插入成功,pair1.second的值为true s2.insert(x); else //插入不成功,说明有重复的 { set<int>::iterator it; for(it=s2.begin();it!=s2.end();it++) //遍历集合s2,把重复的删除 { int num=change(*it); if(y==num) { s2.erase(it); break; } } } } if(s2.size()==0) { cout<<"None"<<endl; } else { set<int>::iterator it1; for(it1=s2.begin();it1!=s2.end();it1++) cout<<*it1<<" "; cout<<endl; } } return 0; }
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复