24 lines
431 B
Text
24 lines
431 B
Text
func is_self_number(n) {
|
|
|
|
if (n < 30) {
|
|
return (((n < 10) && (n.is_odd)) || (n == 20))
|
|
}
|
|
|
|
var qd = (1 + n.ilog10)
|
|
var r = (1 + (n-1)%9)
|
|
var h = (r + 9*(r%2))/2
|
|
var ld = 10
|
|
|
|
while (h + 9*qd >= n%ld) {
|
|
ld *= 10
|
|
}
|
|
|
|
var vs = idiv(n, ld).sumdigits
|
|
n %= ld
|
|
|
|
0..qd -> none { |i|
|
|
vs + sumdigits(n - h - 9*i) == (h + 9*i)
|
|
}
|
|
}
|
|
|
|
say is_self_number.first(50).join(' ')
|