Abundant, deficient and perfect number classifications: Difference between revisions
Content added Content deleted
m (→{{header|F Sharp|F#}}: fix heading, as suggested on the Count examples/Full list/Tier 4 talk page) |
|||
Line 3,817: | Line 3,817: | ||
deficient:15043, perfect:4, abundant:4953 |
deficient:15043, perfect:4, abundant:4953 |
||
</pre> |
</pre> |
||
=={{header|Picat}}== |
|||
<lang Picat>go => |
|||
Classes = new_map([deficient=0,perfect=0,abundant=0]), |
|||
foreach(N in 1..20_000) |
|||
C = classify(N), |
|||
Classes.put(C,Classes.get(C)+1) |
|||
end, |
|||
println(Classes), |
|||
nl. |
|||
% Classify a number N |
|||
classify(N) = Class => |
|||
S = sum_divisors(N), |
|||
if S < N then |
|||
Class1 = deficient |
|||
elseif S = N then |
|||
Class1 = perfect |
|||
elseif S > N then |
|||
Class1 = abundant |
|||
end, |
|||
Class = Class1. |
|||
% Alternative (slightly slower) approach. |
|||
classify2(N,S) = C, S < N => C = deficient. |
|||
classify2(N,S) = C, S == N => C = perfect. |
|||
classify2(N,S) = C, S > N => C = abundant. |
|||
% Sum of divisors |
|||
sum_divisors(N) = Sum => |
|||
sum_divisors(2,N,cond(N>1,1,0),Sum). |
|||
% Part 0: base case |
|||
sum_divisors(I,N,Sum0,Sum), I > floor(sqrt(N)) => |
|||
Sum = Sum0. |
|||
% Part 1: I is a divisor of N |
|||
sum_divisors(I,N,Sum0,Sum), N mod I == 0 => |
|||
Sum1 = Sum0 + I, |
|||
(I != N div I -> |
|||
Sum2 = Sum1 + N div I |
|||
; |
|||
Sum2 = Sum1 |
|||
), |
|||
sum_divisors(I+1,N,Sum2,Sum). |
|||
% Part 2: I is not a divisor of N. |
|||
sum_divisors(I,N,Sum0,Sum) => |
|||
sum_divisors(I+1,N,Sum0,Sum). |
|||
</lang> |
|||
Output: |
|||
<pre>(map)[perfect = 4,deficient = 15043,abundant = 4953]</pre> |
|||
=={{header|PicoLisp}}== |
=={{header|PicoLisp}}== |