数字1827是一个有趣的数字,因为1827 = 21 * 87,所有相同的数字出现在'='的两边。编号136948具有相同的属性:136948 = 146 * 938。
这样的数字叫做吸血鬼号码。更准确地说,数字v是一个吸血鬼号码,如果它有一对因子a和b,其中a * b = v,并且a和b的数字完全相同,数字与v完全相同。数字v,a或b都不能有前导零。数学定义说v应该有数位数字,而a和b应该具有相同的数字位数,但是出于这个问题的目的,我们会放宽这个要求,并允许a和b有不同的数字的数字,并且v具有任意数字的数字。这里有更多的例子:
126 = 6 * 21
10251 = 51 * 201
702189 = 9 * 78021
29632 = 32 * 926
给定数字X,找到大于或等于X的最小吸血鬼数。
输入
在输入中会有几个测试用例。每个测试用例将由包含单个整数X(10≤X≤1000000)的单行组成。输入将以单个0的行结束。
产量
对于每个测试用例,在其自己的行上输出一个整数,这是大于或等于X的最小吸血数。输出没有额外的空格,不用空行分开答案。
样品输入
10
126
127
5000
0
样品输出
126
126
153
这样的数字叫做吸血鬼号码。更准确地说,数字v是一个吸血鬼号码,如果它有一对因子a和b,其中a * b = v,并且a和b的数字完全相同,数字与v完全相同。数字v,a或b都不能有前导零。数学定义说v应该有数位数字,而a和b应该具有相同的数字位数,但是出于这个问题的目的,我们会放宽这个要求,并允许a和b有不同的数字的数字,并且v具有任意数字的数字。这里有更多的例子:
126 = 6 * 21
10251 = 51 * 201
702189 = 9 * 78021
29632 = 32 * 926
给定数字X,找到大于或等于X的最小吸血鬼数。
输入
在输入中会有几个测试用例。每个测试用例将由包含单个整数X(10≤X≤1000000)的单行组成。输入将以单个0的行结束。
产量
对于每个测试用例,在其自己的行上输出一个整数,这是大于或等于X的最小吸血数。输出没有额外的空格,不用空行分开答案。
样品输入
10
126
127
5000
0
样品输出
126
126
153
6880
思路:枚举即可,再用C++的STL寻找即可
#include<cstdio>
#include<string>
#include<set>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main(void)
{
int i, j, n, s;
int a, b, c;
int num[12];
set<int> vampire;
for(i = 1; i < 1005; i++) //较小约数,对最大数开根号
{
for(j = i; j < 1001000 / i ; j++) //另一个约数
{
s = i * j; //可能成为Vampire Numbers的数
a = s; b = i; c = j;
memset(num,0,sizeof(num));
while(a) { num[a % 10]++; a /= 10; }
while(b) { num[b % 10]--; b /= 10; }
while(c) { num[c % 10]--; c /= 10; }
int flag=1;
for(int i=0;i<=9;i++)
if(num[i]!=0)
flag=0;
if(flag)
vampire.insert(s);
}
}
while(scanf("%d", &n) && n){
printf("%d\n", *vampire.lower_bound(n));
}
return 0;
}