码迷,mamicode.com
首页 > 其他好文 > 详细

UVA - 10396 Vampire Numbers 暴力+打表

时间:2015-05-02 09:41:09      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:

题目大意:给出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;
}

UVA - 10396 Vampire Numbers 暴力+打表

标签:

原文地址:http://blog.csdn.net/l123012013048/article/details/45424841

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!