题目大意:给出n,要求你输出所有符合规则的n位数
规则如下,这个n位数由两个n/2位数相乘得到,并且满足
1.这n位数为偶数
2.这两个n/2位数上的所有数刚好组成了这n位数
3.两个n/2位数不能都是10的倍数
解题思路:因为输入只有4,6,8,所以先预处理,暴力枚举4,6,8的情况,然后打表
#include<cstdio>
#include<set>
#include<cmath>
using namespace std;
#define maxn 10
set<int> ans[maxn];
int vis[maxn];
void init(int n) {
int start = pow(10,n-1);
int end = pow(10,n);
int MIN = pow(10,2 * n -1);
int MAX = pow(10,2*n);
for(int i = start; i < end; i++)
for(int j = i; j < end; j++) {
if(i % 10 == 0 && j % 10 == 0)
continue;
int t = i * j;
if(t % 2 || t < MIN || t >= MAX)
continue;
int x = i, y = j;
for(int i = 0; i < 10; i++)
vis[i] = 0;
while(x) {
vis[x % 10]++;
x = x / 10;
}
while(y) {
vis[y % 10]++;
y = y / 10;
}
bool flag = true;
int tt;
while(t) {
tt = t % 10;
if(vis[tt] == 0) {
flag = false;
break;
}
vis[tt]--;
t /= 10;
}
if(flag)
ans[n*2].insert(i*j);
}
}
int main() {
int n;
init(2);
init(3);
init(4);
while(scanf("%d", &n) == 1) {
for(set<int>::iterator it = ans[n].begin(); it != ans[n].end(); it++)
printf("%d\n", *it);
printf("\n");
}
return 0;
}
时间: 2024-10-31 15:42:26