UVA - 10396 Vampire Numbers 暴力+打表

题目大意:给出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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值