67 lines
1.2 KiB
Fortran
67 lines
1.2 KiB
Fortran
program happy
|
|
|
|
implicit none
|
|
integer, parameter :: find = 8
|
|
integer :: found
|
|
integer :: number
|
|
|
|
found = 0
|
|
number = 1
|
|
do
|
|
if (found == find) then
|
|
exit
|
|
end if
|
|
if (is_happy (number)) then
|
|
found = found + 1
|
|
write (*, '(i0)') number
|
|
end if
|
|
number = number + 1
|
|
end do
|
|
|
|
contains
|
|
|
|
function sum_digits_squared (number) result (result)
|
|
|
|
implicit none
|
|
integer, intent (in) :: number
|
|
integer :: result
|
|
integer :: digit
|
|
integer :: rest
|
|
integer :: work
|
|
|
|
result = 0
|
|
work = number
|
|
do
|
|
if (work == 0) then
|
|
exit
|
|
end if
|
|
rest = work / 10
|
|
digit = work - 10 * rest
|
|
result = result + digit * digit
|
|
work = rest
|
|
end do
|
|
|
|
end function sum_digits_squared
|
|
|
|
function is_happy (number) result (result)
|
|
|
|
implicit none
|
|
integer, intent (in) :: number
|
|
logical :: result
|
|
integer :: turtoise
|
|
integer :: hare
|
|
|
|
turtoise = number
|
|
hare = number
|
|
do
|
|
turtoise = sum_digits_squared (turtoise)
|
|
hare = sum_digits_squared (sum_digits_squared (hare))
|
|
if (turtoise == hare) then
|
|
exit
|
|
end if
|
|
end do
|
|
result = turtoise == 1
|
|
|
|
end function is_happy
|
|
|
|
end program happy
|