From 3dd22dd54c66414517e211207fb640e12d177a4f Mon Sep 17 00:00:00 2001 From: Shaked Shlomo Date: Tue, 2 Jun 2026 02:51:31 +0300 Subject: [PATCH] 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). --- Maths/FriendlyNumbers.js | 2 +- Maths/test/FriendlyNumbers.test.js | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 Maths/test/FriendlyNumbers.test.js diff --git a/Maths/FriendlyNumbers.js b/Maths/FriendlyNumbers.js index f7440384b4..e52415466d 100644 --- a/Maths/FriendlyNumbers.js +++ b/Maths/FriendlyNumbers.js @@ -29,7 +29,7 @@ function abundancyIndex(number) { function sumDivisors(number) { let runningSumDivisors = number - for (let i = 0; i < number / 2; i++) { + for (let i = 1; i <= number / 2; i++) { if (Number.isInteger(number / i)) { runningSumDivisors += i } diff --git a/Maths/test/FriendlyNumbers.test.js b/Maths/test/FriendlyNumbers.test.js new file mode 100644 index 0000000000..7f9e15389e --- /dev/null +++ b/Maths/test/FriendlyNumbers.test.js @@ -0,0 +1,21 @@ +import { FriendlyNumbers } from '../FriendlyNumbers' + +describe('FriendlyNumbers', () => { + it('should return true for the perfect-number pair 6 and 28', () => { + expect(FriendlyNumbers(6, 28)).toBe(true) + }) + + it('should return true for the friendly pair 30 and 140', () => { + expect(FriendlyNumbers(30, 140)).toBe(true) + }) + + it('should return false for numbers with different abundancy', () => { + expect(FriendlyNumbers(15, 20)).toBe(false) + }) + + it('should throw for invalid input', () => { + expect(() => FriendlyNumbers(6, 6)).toThrow() + expect(() => FriendlyNumbers(0, 5)).toThrow() + expect(() => FriendlyNumbers(1.5, 5)).toThrow() + }) +})