Steady squares: Difference between revisions

Added Fe
(Added Fe)
Line 789:
625^2 = 390,625
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>
 
3,038

edits