77 lines
1.8 KiB
JavaScript
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();
|