解题思路:
枚举组成5,6位的那些数字,再组成,用set存储(自动排序),因为有相同再次插入也没事;
注意事项:
判断有0在组合中的情况
参考代码:
#include<iostream>
#include<algorithm>
#include<map>
#include<string>
#include<queue>
#include<set>
#define ll long long
using namespace std;
inline ll read() {
ll s = 0, w = 1;
char c = getchar();
while (c < '0' || c>'9') {
if (c == '-') w = -1;
c = getchar();
}
while (c <= '9' && c >= '0') s = s * 10 + c - '0', c = getchar();
return s * w;
}
set<int>s;
void fff(int a, int b, int c) { //枚举两个a,两个b。两个c的情况
int k = (a * 100 + b * 10 + c) * 1000 + c * 100 + b * 10 + a;
if (k > 9999 && a != 0) s.insert(k) ; //特判开头不能为零,不然就变5位数了,如(0)11110,但是中间有0没事,如110011,
swap(a, b);
k = (a * 100 + b * 10 + c) * 1000 + c * 100 + b * 10 + a;
if (k > 9999 && a != 0) s.insert(k);
swap(a, c);
k = (a * 100 + b * 10 + c) * 1000 + c * 100 + b * 10 + a;
if (k > 9999 && a != 0) s.insert(k);
swap(a, b);
k = ((a * 100 + b * 10 + c) * 1000 + c * 100 + b * 10 + a);
if (k > 9999 && a != 0) s.insert(k);
swap(a, c);
k = ((a * 100 + b * 10 + c) * 1000 + c * 100 + b * 10 + a);
if (k > 9999 && a != 0) s.insert(k);
swap(a, b);
k = ((a * 100 + b * 10 + c) * 1000 + c * 100 + b * 10 + a);
if (k > 9999 && a != 0) s.insert(k);
}
void ff(int a, int b) {//前面a为4个数字的,后面的为两个数字
int k = ((a * 100 + a * 10 + b) * 1000 + b * 100 + a * 10 + a);
if (k > 9999&&a!=0) s.insert(k);
k = ((a * 100 + b * 10 + a) * 1000 + a * 100 + b * 10 + a);
if (k > 9999&&a!=0) s.insert(k);
k = ((b * 100 + a * 10 + a) * 1000 + a * 100 + a * 10 + b);
if (k > 9999&&b!=0) s.insert(k);
}
void f(int a,int b) { //全为a数字,共b(5或6)位
int k=(((a*10+a)*10+a)*10+a)*10+a;
if (k > 9999) {
if (b == 6&&(k*10+a)>99999)s.insert((k * 10 + a));
else s.insert(k);
}
}
void f5(int a, int b, int c) { //a两个,b两个,c一个
int k = ((a * 100 + b * 10 + c) * 100 + b * 10 + a);
if(k>9999)s.insert(k);
swap(a, b);
k = ((a * 100 + b * 10 + c) * 100 + b * 10 + a);
if (k > 9999)s.insert(k);
}
void f2(int a, int b) { //三个a,一个b
int k;
k = (b * 100 + a * 10 + a) * 100 + a * 10 + b;
if (k > 9999) s.insert(k);
}
int main() {
ll n = read();
for (int i = 0; i <= 9; i++) {
if (i * 5 == n) f(i, 5);
if (i * 6 == n) f(i,6);
for (int j = 0; j <= 9; j++) {
if (i * 3 + j * 2 == n) f2( i, j);
if (i * 4+j*2 == n) ff(i,j);
for (int k = 0; k <= 9; k++) {
if (i * 2 + j * 2 + k == n) f5(i, j, k);
if (i * 2 + j * 2 + k * 2 == n)fff(i, j, k);
}
}
}
if (s.empty()) cout << -1;
else for (auto p : s) cout << p << endl;
return 0;
}
0.0分
3 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复