Perfect numbers: Difference between revisions

no edit summary
(Updated both D entries)
No edit summary
Line 501:
With a <code>33_550_337.iota</code> it outputs:
<pre>[6, 28, 496, 8128, 33550336]</pre>
 
=={{header|Dart}}==
=== Explicit Iterative Version ===
<lang d>/*
* Function to test if a number is a perfect number
* A number is a perfect number if it is equal to the sum of all its divisors
* Input: Positive integer n
* Output: true if n is a perfect number, false otherwise
*/
bool isPerfect(int n){
//Generate a list of integers in the range 1 to n-1 : [1, 2, ..., n-1]
List<int> range = new List<int>.generate(n-1, (int i) => i+1);
 
//Create a list that filters the divisors of n from range
List<int> divisors = new List.from(range.where((i) => n%i == 0));
 
//Sum the all the divisors
int sumOfDivisors = 0;
for (int i = 0; i < divisors.length; i++){
sumOfDivisors = sumOfDivisors + divisors[i];
}
 
// A number is a perfect number if it is equal to the sum of its divisors
// We return the test if n is equal to sumOfDivisors
return n == sumOfDivisors;
}</lang>
 
=== Compact Version ===
{{trans|Julia}}
<lang d>isPerfect(n) =>
n == new List.generate(n-1, (i) => n%(i+1) == 0 ? i+1 : 0).fold(0, (p,n)=>p+n);</lang>
 
In either case, if we test to find all the perfect numbers up to 1000, we get:
<lang d>main() =>
new List.generate(1000,(i)=>i+1).where(isPerfect).forEach(print);</lang>
{{out}}
<pre>6
28
496</pre>
 
=={{header|E}}==