mathball
Version:
A JavaScript library for Competitive Programming
64 lines (55 loc) • 1.36 kB
JavaScript
;
/* 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);
};