Vampire Numbers 数字的合理分解

数字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

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值