33 lines
857 B
Lua
33 lines
857 B
Lua
-- Return length of an integer without string conversion
|
|
function numLength (n)
|
|
local length = 0
|
|
repeat
|
|
n = math.floor(n / 10)
|
|
length = length + 1
|
|
until n == 0
|
|
return length
|
|
end
|
|
|
|
-- Return a boolean indicating whether n is a Kaprekar number
|
|
function isKaprekar (n)
|
|
if n == 1 then return true end
|
|
local nSquared, a, b = n * n
|
|
for splitPoint = 1, numLength(nSquared) - 1 do
|
|
a = math.floor(nSquared / 10^splitPoint)
|
|
b = nSquared % 10^splitPoint
|
|
if a > 0 and b > 0 and a + b == n then return true end
|
|
end
|
|
return false
|
|
end
|
|
|
|
-- Main task
|
|
for n = 1, 10^4 do
|
|
if isKaprekar(n) then io.write(n .. " ") end
|
|
end
|
|
|
|
-- Extra credit
|
|
local count = 0
|
|
for n = 1, 10^6 do
|
|
if isKaprekar(n) then count = count + 1 end
|
|
end
|
|
print("\nThere are " .. count .. " Kaprekar numbers under one million.")
|