Skip to content

Commit 3dd22dd

Browse files
Shaked ShlomoShaked Shlomo
authored andcommitted
fix: include number/2 divisor in FriendlyNumbers sumDivisors
sumDivisors looped 'for (let i = 0; i < number / 2; i++)', which excludes i === number/2 -- a real divisor of every even number -- so the divisor sum (and abundancy index) was wrong for even inputs, e.g. sumDivisors(6) returned 9 instead of 12 and sumDivisors(28) returned 42 instead of 56. That made FriendlyNumbers misclassify pairs (e.g. FriendlyNumbers(15, 20) returned true though their abundancy indices differ). Loop from 1 to number/2 inclusive. Added a test file (the module had none).
1 parent 5c39e87 commit 3dd22dd

2 files changed

Lines changed: 22 additions & 1 deletion

File tree

Maths/FriendlyNumbers.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ function abundancyIndex(number) {
2929

3030
function sumDivisors(number) {
3131
let runningSumDivisors = number
32-
for (let i = 0; i < number / 2; i++) {
32+
for (let i = 1; i <= number / 2; i++) {
3333
if (Number.isInteger(number / i)) {
3434
runningSumDivisors += i
3535
}

Maths/test/FriendlyNumbers.test.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { FriendlyNumbers } from '../FriendlyNumbers'
2+
3+
describe('FriendlyNumbers', () => {
4+
it('should return true for the perfect-number pair 6 and 28', () => {
5+
expect(FriendlyNumbers(6, 28)).toBe(true)
6+
})
7+
8+
it('should return true for the friendly pair 30 and 140', () => {
9+
expect(FriendlyNumbers(30, 140)).toBe(true)
10+
})
11+
12+
it('should return false for numbers with different abundancy', () => {
13+
expect(FriendlyNumbers(15, 20)).toBe(false)
14+
})
15+
16+
it('should throw for invalid input', () => {
17+
expect(() => FriendlyNumbers(6, 6)).toThrow()
18+
expect(() => FriendlyNumbers(0, 5)).toThrow()
19+
expect(() => FriendlyNumbers(1.5, 5)).toThrow()
20+
})
21+
})

0 commit comments

Comments
 (0)