Skip to content
This repository was archived by the owner on Aug 1, 2021. It is now read-only.

Commit ef87145

Browse files
komygmatthewmorgan
authored andcommitted
Add exercise perfect-numbers (#332)
* Implement exercise perfect-numbers * Implemented perfect-numbers exercise. * Added semicolons and curly braces. * Removed the divisors module. * Updated config.json with the 'perfect-numbers' exercise info. * Updated config.json. Solved typo 'prefect-numbers' instead of 'perfect-numbers' * Updated config.json - Reordered perfect-numbers exercise.
1 parent d46a630 commit ef87145

File tree

3 files changed

+153
-0
lines changed

3 files changed

+153
-0
lines changed

config.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
"rna-transcription",
1212
"bob",
1313
"gigasecond",
14+
"perfect-numbers",
1415
"word-count",
1516
"isogram",
1617
"pangram",
@@ -201,6 +202,12 @@
201202
"difficulty": 1,
202203
"topics": [
203204
]
205+
},
206+
{
207+
"slug": "perfect-numbers",
208+
"difficulty": 1,
209+
"topics": [
210+
]
204211
},
205212
{
206213
"slug": "word-count",

exercises/perfect-numbers/example.js

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
'use strict';
2+
3+
var PerfectNumbers = function() {
4+
5+
};
6+
7+
/**
8+
* Calculate all the divisors for a given number and return them as an array.
9+
* Note: the actual number is not include in the returned array.
10+
*/
11+
PerfectNumbers.prototype.getDivisors = function(number) {
12+
13+
var i;
14+
var divs = new Array();
15+
16+
// Accepts only natura numbers greater than 1.
17+
if (number <= 1) {
18+
return divs;
19+
}
20+
21+
// 1 always divides everyone!
22+
divs.push(1);
23+
24+
// Calculate the divisors up the the half of the number + 1
25+
for (i = 2; i <= number / 2; i++) {
26+
27+
if (number % i === 0) {
28+
divs.push(i);
29+
}
30+
}
31+
32+
return divs;
33+
};
34+
35+
PerfectNumbers.prototype.classify = function(number) {
36+
37+
var i, sum, result;
38+
39+
// Check if the input is valid
40+
if (number <= 0) {
41+
return 'Classification is only possible for natural numbers.';
42+
}
43+
44+
// Factorize the current number.
45+
var divsArray = this.getDivisors(number);
46+
47+
// Sum the factors.
48+
sum = 0;
49+
for (i = 0; i < divsArray.length; i++) {
50+
sum = sum + divsArray[i];
51+
}
52+
53+
// Check if the number is perfect.
54+
if (sum === number) {
55+
result = 'perfect';
56+
}
57+
else if (sum > number) {
58+
result = 'abundant';
59+
}
60+
else {
61+
result = 'deficient';
62+
}
63+
64+
return result;
65+
};
66+
67+
module.exports = PerfectNumbers;
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
var PerfectNumbers = require('./perfect-numbers');
2+
3+
describe('Exercise - Perfect Numbers', function() {
4+
5+
var perfectNumbers;
6+
7+
beforeEach(function () {
8+
perfectNumbers = new PerfectNumbers();
9+
});
10+
11+
describe('Perfect Numbers', function() {
12+
13+
it('Smallest perfect number is classified correctly', function() {
14+
expect(perfectNumbers.classify(6)).toEqual('perfect');
15+
});
16+
17+
it('Medium perfect number is classified correctly', function() {
18+
expect(perfectNumbers.classify(28)).toEqual('perfect');
19+
});
20+
21+
it('Large perfect number is classified correctly', function() {
22+
expect(perfectNumbers.classify(33550336)).toEqual('perfect');
23+
});
24+
25+
});
26+
27+
describe('Abundant Numbers', function() {
28+
29+
it('Smallest abundant number is classified correctly', function() {
30+
expect(perfectNumbers.classify(12)).toEqual('abundant');
31+
});
32+
33+
it('Medium abundant number is classified correctly', function() {
34+
expect(perfectNumbers.classify(30)).toEqual('abundant');
35+
});
36+
37+
it('Large abundant number is classified correctly', function() {
38+
expect(perfectNumbers.classify(33550335)).toEqual('abundant');
39+
});
40+
41+
});
42+
43+
describe('Deficient Numbers', function() {
44+
45+
it('Smallest prime deficient number is classified correctly', function() {
46+
expect(perfectNumbers.classify(2)).toEqual('deficient');
47+
});
48+
49+
it('Smallest non-prime deficient number is classified correctly', function() {
50+
expect(perfectNumbers.classify(4)).toEqual('deficient');
51+
});
52+
53+
it('Medium deficient number is classified correctly', function() {
54+
expect(perfectNumbers.classify(32)).toEqual('deficient');
55+
});
56+
57+
it('Large deficient number is classified correctly', function() {
58+
expect(perfectNumbers.classify(33550337)).toEqual('deficient');
59+
});
60+
61+
it('Edge case (no factors other than itself) is classified correctly', function() {
62+
expect(perfectNumbers.classify(1)).toEqual('deficient');
63+
});
64+
65+
});
66+
67+
describe('Invalid Inputs', function() {
68+
69+
it('Zero is rejected (not a natural number)', function() {
70+
expect(perfectNumbers.classify(0)).toEqual('Classification is only possible for natural numbers.');
71+
});
72+
73+
it('Negative integer is rejected (not a natural number)', function() {
74+
expect(perfectNumbers.classify(-1)).toEqual('Classification is only possible for natural numbers.');
75+
});
76+
77+
});
78+
79+
});

0 commit comments

Comments
 (0)