Steady squares: Difference between revisions
Content added Content deleted
(→{{header|Euler}}: Tweak) |
(Added Fe) |
||
Line 789: | Line 789: | ||
625^2 = 390,625 |
625^2 = 390,625 |
||
9376^2 = 87,909,376 |
9376^2 = 87,909,376 |
||
</pre> |
|||
=={{header|Fe}}== |
|||
<syntaxhighlight lang="clojure"> |
|||
(= steadySquares |
|||
(fn (maxNumber) |
|||
(let powerOfTen 10) ; 10^(one more than the number of digits in n) |
|||
(let lastDigit (list 1 5 6)); a steady square must end with 1, 5 or 6 |
|||
(let lastResult (cons 0 nil)); latest steady square start with a dummy 0 |
|||
(let result lastResult) ; list of steady squares - dummy leading 0 |
|||
(let n -10) ; multiple of 10 to consider |
|||
(while (do (= n (+ n 10)) ; find steady squares up to maxNumber |
|||
(<= n maxNumber) |
|||
) |
|||
(if (is n powerOfTen) |
|||
(= powerOfTen (* powerOfTen 10)); number of digits has increased |
|||
) |
|||
(let d lastDigit) |
|||
(while (not (atom d)) ; try n + each possible lastDigit |
|||
(let nd (+ n (car d))) |
|||
(let n2 (* nd nd)) |
|||
; Fe doesn't have a mod operator, integer division or a way |
|||
; to truncate a float to an integer, so we calculate |
|||
; n2 mod powerOfTen using repeated subtraction |
|||
(let n2%p10 n2) ; see FizzBuzz for doing it with a C function |
|||
(while (<= powerOfTen n2%p10) |
|||
(= n2%p10 (- n2%p10 powerOfTen)) |
|||
) |
|||
(if (is nd n2%p10) |
|||
(do (setcdr lastResult (cons nd nil)) |
|||
(= lastResult (cdr lastResult)) |
|||
) |
|||
) |
|||
(= d (cdr d)) |
|||
) |
|||
) |
|||
(cdr result) ; return the list of steady squares without the dummy 0 |
|||
) |
|||
) |
|||
(print (steadySquares 10000)) |
|||
</syntaxhighlight> |
|||
{{out}} |
|||
<pre> |
|||
(1 5 6 25 76 376 625 9376) |
|||
</pre> |
</pre> |
||