吸血鬼数
* * * *
拉格朗日计划
* * * *
吸血鬼数

若一个自然数n可以分解为另外两个自然数a,b的乘积,且满足:

1) a,b的位数相同且都是n的位数的一半。

2) 把a,b拼接后重排其数字可以得到n。

3) a,b不同时以0结尾。


就称n为吸血鬼数,并称a,b为其獠牙。例如 $$1260=21\times 60, \quad 1395=15\times 93, \quad 1435=35\times 41, \quad 1530=30\times 51,$$ 都是吸血鬼数。

打印1到1000000之间的吸血鬼数,每个数单独一行,注意不要超时。

本题难度:



解答

显然这样的数或者四位,或者六位,对应獠牙两位和三位的情况。

定义匿名方法f,接受獠牙的范围作为参数,生成对应位数的吸血鬼数,分别传入11到99和101到999作为参数生成四位和六位的吸血鬼数,去重排序后输出。

最终代码有三行。

代码长度:143字节 vs. 全站第一:106字节。

s=sorted
f=lambda a:s({i*j for i in a for j in a if s(str(i*j))==s(str(i)+str(j))and i%10+j%10})
*map(print,f(range(11,99))+f(range(101,999))),