63 lines
1.8 KiB
Java
63 lines
1.8 KiB
Java
public class RhondaNumbers {
|
|
public static void main(String[] args) {
|
|
final int limit = 15;
|
|
for (int base = 2; base <= 36; ++base) {
|
|
if (isPrime(base))
|
|
continue;
|
|
System.out.printf("First %d Rhonda numbers to base %d:\n", limit, base);
|
|
int numbers[] = new int[limit];
|
|
for (int n = 1, count = 0; count < limit; ++n) {
|
|
if (isRhonda(base, n))
|
|
numbers[count++] = n;
|
|
}
|
|
System.out.printf("In base 10:");
|
|
for (int i = 0; i < limit; ++i)
|
|
System.out.printf(" %d", numbers[i]);
|
|
System.out.printf("\nIn base %d:", base);
|
|
for (int i = 0; i < limit; ++i)
|
|
System.out.printf(" %s", Integer.toString(numbers[i], base));
|
|
System.out.printf("\n\n");
|
|
}
|
|
}
|
|
|
|
private static int digitProduct(int base, int n) {
|
|
int product = 1;
|
|
for (; n != 0; n /= base)
|
|
product *= n % base;
|
|
return product;
|
|
}
|
|
|
|
private static int primeFactorSum(int n) {
|
|
int sum = 0;
|
|
for (; (n & 1) == 0; n >>= 1)
|
|
sum += 2;
|
|
for (int p = 3; p * p <= n; p += 2)
|
|
for (; n % p == 0; n /= p)
|
|
sum += p;
|
|
if (n > 1)
|
|
sum += n;
|
|
return sum;
|
|
}
|
|
|
|
private static boolean isPrime(int n) {
|
|
if (n < 2)
|
|
return false;
|
|
if (n % 2 == 0)
|
|
return n == 2;
|
|
if (n % 3 == 0)
|
|
return n == 3;
|
|
for (int p = 5; p * p <= n; p += 4) {
|
|
if (n % p == 0)
|
|
return false;
|
|
p += 2;
|
|
if (n % p == 0)
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
private static boolean isRhonda(int base, int n) {
|
|
return digitProduct(base, n) == base * primeFactorSum(n);
|
|
}
|
|
}
|