哈沙德数

能够被其各位数字和整除的数被称为哈沙德数或奈文数。
201是一个哈沙德数,因为它能被3整除(其各位数字和是3)。
如果我们截去201的最后一位数字,我们得到20,同样是一个哈沙德数。
如果我们截去20的最后一位数字,我们得到2,仍然是一个哈沙德数。
如果一个哈沙德数不断截去最后一位数字的结果始终是哈沙德数,我们称之为可右截哈沙德数。

此外:
201/3=67是一个素数。
如果一个哈沙德数被其各位数字除的结果是一个素数,我们称之为强哈沙德数。

现在我们取素数2011。
如果我们截去2011的最后一位数字,我们得到201,一个可右截的强哈沙德数。
我们称这样的素数为可右截强哈沙德素数。

已知所有小于10000的可右截强哈沙德素数之和为90619。

求所有小于1014的可右截强哈沙德素数之和。

用如下程序验证

function ish(n) #哈沙德数
n1=n
s=0
while n1>=10
s+=n1%10
n1=div(n1,10)
end
return n%(s+n1)==0
end

N=10^4
p=zeros(Bool,N);

function setp(n) #筛法求质数
qn=floor(Int,sqrt(n));
p[1]=1
for i in 2:qn
for j in i:div(n,i)
p[i*j]=1
end
end
#[x for x in 1:N if p[x]==0]
end

function isp(n) #质数
return p[n]==0
end

function ish2(n) #可右截哈沙德数
n1=n
while n1>=10
if ish(n1)==false return false end
n1=div(n1,10)
end
true
end

function ish3(n) #强哈沙德数
n1=n
s=0
while n1>=10
s+=n1%10
n1=div(n1,10)
end
return ish2(n) && isp(div(n,(s+n1)))
end

function ish4(n) #可右截强哈沙德素数
return n>=10 && isp(n) && ish3(div(n,10))
end

function su4(n) #求和
s=0
for i in 1:n
if ish4(i) 
s+=i;
#print("$i ") 
end
end
s
end

结果

julia> N=10^4
10000
julia> setp(N);
julia> su4(N)
181 211 271 277 421 457 631 2011 2017 2099 2473 2477 4021 4027 4073 4079 4231 4813 4817 6037 8011 8017 8039 8461 8467  
su=90619