解题思路:
枚举组成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语言训练-角谷猜想 (C++代码)(3N+1问题)浏览:1850 |
C二级辅导-同因查找 (C语言代码)浏览:626 |
C语言训练-求矩阵的两对角线上的元素之和 (C语言代码)浏览:619 |
三角形 (C++代码)记忆化搜索浏览:1318 |
C语言程序设计教程(第三版)课后习题6.3 (C语言代码)浏览:687 |
C语言程序设计教程(第三版)课后习题6.9 (C语言代码)浏览:761 |
a+b浏览:452 |
1128题解(返回值为数组的情况)浏览:571 |
Tom数 (C语言代码)浏览:758 |
C语言程序设计教程(第三版)课后习题10.7 (用指针求解)浏览:1542 |