RosettaCodeData/Task/Brazilian-numbers/JavaScript/brazilian-numbers.js
2026-04-30 12:34:36 -04:00

77 lines
1.8 KiB
JavaScript

function sameDigits(n, b) {
let f = n % b;
while ((n = Math.floor(n / b)) > 0) {
if (n % b !== f) {
return false;
}
}
return true;
}
function isBrazilian(n) {
if (n < 7) return false;
if (n % 2 === 0) return true;
for (let b = 2; b < n - 1; b++) {
if (sameDigits(n, b)) {
return true;
}
}
return false;
}
function isPrime(n) {
if (n < 2) return false;
if (n % 2 === 0) return n === 2;
if (n % 3 === 0) return n === 3;
let d = 5;
while (d * d <= n) {
if (n % d === 0) return false;
d += 2;
if (n % d === 0) return false;
d += 4;
}
return true;
}
function main() {
const kinds = ["", "odd ", "prime "];
for (const kind of kinds) {
let quiet = false;
const BigLim = 99999;
const limit = 20;
console.log(`First ${limit} ${kind}Brazilian numbers:`);
let c = 0;
let n = 7;
while (c < BigLim) {
if (isBrazilian(n)) {
if (!quiet) process.stdout.write(n + ' ');
if (++c === limit) {
console.log("\n");
quiet = true;
}
}
if (quiet && kind !== "") continue;
if (kind === "") {
n++;
} else if (kind === "odd ") {
n += 2;
} else if (kind === "prime ") {
while (true) {
n += 2;
if (isPrime(n)) break;
}
} else {
throw new Error("Unexpected");
}
}
if (kind === "") {
console.log(`The ${BigLim + 1}th Brazilian number is: ${n}\n`);
}
}
}
main();