Smith数
* * * *
拉格朗日计划
* * * *
Smith数

各位数字之和与其所有素因子(计入重数)各位数字之和相等的合数称为Smith数。

例如666是Smith数,因为$666=2\times 3\times 3\times 37$,而$6+6+6=18=2+3+3+(3+7)$。

打印0到10000之间的Smith数,每个数单独一行。

本题难度:



解答

生成100以内的素数表放在d中。

用f计算各位数字和(特别地,数字1既不是素数也不是合数、其和定义为0)。

用g递归计算素因子的数字和。

最后根据定义判断并打印输出。

最终代码有七行。

代码长度:237字节 vs. 全站第一:104字节。

f=lambda n:sum(map(int,str(n)))*(n>1)
d=[j for j in range(2,99)if all(j%i for i in range(2,j))]
def g(n):
  for p in d:
  if n%p<1:return f(p)+g(n//p)
  return f(n)
for k in range(10001):any((k%p<1)*(p<k)for p in d)and f(k)==g(k)==print(k)