UNPKG

mathball

Version:

A JavaScript library for Competitive Programming

64 lines (55 loc) 1.36 kB
'use strict'; /* Smith Number * Function: isSmith() */ var validate = require('../validation/positive-integer'); var primes = new Array(); var MAX = 10000; function sieveSundaram() { var marked = new Array(Math.floor(MAX / 2) + 100); for (var i = 0; i < Math.floor(MAX / 2) + 100; i++) { marked[i] = false; } for (var _i = 1; _i <= Math.floor((Math.sqrt(MAX) - 1) / 2); _i++) { for (var j = _i * (_i + 1) << 1; j <= Math.floor(MAX / 2); j = j + 2 * _i + 1) { marked[j] = true; } } primes.push(2); for (var _i2 = 1; _i2 <= Math.floor(MAX / 2); _i2++) { if (marked[_i2] === false) { primes.push(2 * _i2 + 1); } } } function smith(num) { var originalNo = num; var pDigitSum = 0; for (var i = 0; primes[i] <= Math.floor(num / 2); i++) { while (num % primes[i] === 0) { var p = primes[i]; num = Math.floor(num / p); while (p > 0) { pDigitSum = pDigitSum + p % 10; p = Math.floor(p / 10); } } } if (num !== 1 && num !== originalNo) { while (num > 0) { pDigitSum = pDigitSum + num % 10; num = Math.floor(num / 10); } } var sumDigits = 0; while (originalNo > 0) { sumDigits = sumDigits + originalNo % 10; originalNo = Math.floor(originalNo / 10); } return pDigitSum === sumDigits; } exports.check = function (num) { validate(num, 'isSmith'); sieveSundaram(); return smith(num); };