111 lines
2.5 KiB
Text
111 lines
2.5 KiB
Text
class
|
|
APPLICATION
|
|
|
|
create
|
|
make
|
|
|
|
feature
|
|
|
|
fang_check (original, fang1, fang2: INTEGER_64): BOOLEAN
|
|
-- Are 'fang1' and 'fang2' correct fangs of the 'original' number?
|
|
require
|
|
original_positive: original > 0
|
|
fangs_positive: fang1 > 0 and fang2 > 0
|
|
local
|
|
original_length: INTEGER
|
|
fang, ori: STRING
|
|
sort_ori, sort_fang: SORTED_TWO_WAY_LIST [CHARACTER]
|
|
do
|
|
create sort_ori.make
|
|
create sort_fang.make
|
|
create ori.make_empty
|
|
create fang.make_empty
|
|
original_length := original.out.count // 2
|
|
if fang1.out.count /= original_length or fang2.out.count /= (original_length) then
|
|
Result := False
|
|
elseif fang1.out.ends_with ("0") and fang2.out.ends_with ("0") then
|
|
Result := False
|
|
else
|
|
across
|
|
1 |..| original.out.count as c
|
|
loop
|
|
sort_ori.extend (original.out [c.item])
|
|
end
|
|
across
|
|
sort_ori as o
|
|
loop
|
|
ori.extend (o.item)
|
|
end
|
|
across
|
|
1 |..| fang1.out.count as c
|
|
loop
|
|
sort_fang.extend (fang1.out [c.item])
|
|
sort_fang.extend (fang2.out [c.item])
|
|
end
|
|
across
|
|
sort_fang as f
|
|
loop
|
|
fang.extend (f.item)
|
|
end
|
|
Result := fang.same_string (ori)
|
|
end
|
|
ensure
|
|
fangs_right_length: Result implies original.out.count = fang1.out.count + fang2.out.count
|
|
end
|
|
|
|
make
|
|
-- Uses fang_check to find vampire nubmers.
|
|
local
|
|
i, numbers: INTEGER
|
|
fang1, fang2: INTEGER_64
|
|
num: ARRAY [INTEGER_64]
|
|
math: DOUBLE_MATH
|
|
do
|
|
create math
|
|
from
|
|
i := 1000
|
|
until
|
|
numbers > 25
|
|
loop
|
|
if i.out.count \\ 2 = 0 then
|
|
from
|
|
fang1 := 10
|
|
until
|
|
fang1 >= math.sqrt (i)
|
|
loop
|
|
if (i \\ fang1 = 0) then
|
|
fang2 := i // fang1
|
|
if i \\ 9 = (fang1 + fang2) \\ 9 then
|
|
if fang1 * fang2 = i and fang1 <= fang2 and then fang_check (i, fang1, fang2) then
|
|
numbers := numbers + 1
|
|
io.put_string (i.out + ": " + fang1.out + " " + fang2.out)
|
|
io.new_line
|
|
end
|
|
end
|
|
end
|
|
fang1 := fang1 + 1
|
|
end
|
|
end
|
|
i := i + 1
|
|
end
|
|
num := <<16758243290880, 24959017348650, 14593825548650>>
|
|
across
|
|
num as n
|
|
loop
|
|
from
|
|
fang1 := 1000000
|
|
until
|
|
fang1 >= math.sqrt (n.item) + 1
|
|
loop
|
|
if (n.item \\ fang1 = 0) then
|
|
fang2 := (n.item // fang1)
|
|
if fang1 * fang2 = n.item and fang1 <= fang2 and then fang_check (n.item, fang1, fang2) then
|
|
io.put_string (n.item.out + ": " + fang1.out + " " + fang2.out + "%N")
|
|
end
|
|
end
|
|
fang1 := fang1 + 1
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|