mirror of
https://github.com/TheAlgorithms/Java.git
synced 2025-12-19 07:00:35 +08:00
committed by
GitHub
parent
8a339ef2e2
commit
98eecb9f16
52
src/main/java/com/thealgorithms/maths/SmithNumber.java
Normal file
52
src/main/java/com/thealgorithms/maths/SmithNumber.java
Normal file
@@ -0,0 +1,52 @@
|
||||
package com.thealgorithms.maths;
|
||||
|
||||
import com.thealgorithms.maths.Prime.PrimeCheck;
|
||||
|
||||
/**
|
||||
* In number theory, a smith number is a composite number for which, in a given number base,
|
||||
* the sum of its digits is equal to the sum of the digits in its prime factorization in the same base.
|
||||
*
|
||||
* For example, in base 10, 378 = 21 X 33 X 71 is a Smith number since 3 + 7 + 8 = 2 X 1 + 3 X 3 + 7 X 1,
|
||||
* and 22 = 21 X 111 is a Smith number, because 2 + 2 = 2 X 1 + (1 + 1) X 1.
|
||||
*
|
||||
* Wiki: https://en.wikipedia.org/wiki/Smith_number
|
||||
*/
|
||||
public final class SmithNumber {
|
||||
|
||||
private SmithNumber() {
|
||||
}
|
||||
|
||||
private static int primeFactorDigitSum(int n) {
|
||||
int sum = 0;
|
||||
int num = n;
|
||||
|
||||
// Factorize the number using trial division
|
||||
for (int i = 2; i * i <= num; i++) {
|
||||
while (n % i == 0) { // while i divides n
|
||||
sum += SumOfDigits.sumOfDigits(i); // add sum of digits of factor
|
||||
n /= i; // divide n by the factor
|
||||
}
|
||||
}
|
||||
|
||||
// If n is still > 1, it itself is a prime factor
|
||||
if (n > 1) {
|
||||
sum += SumOfDigits.sumOfDigits(n);
|
||||
}
|
||||
|
||||
return sum;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if {@code number} is Smith number or not
|
||||
*
|
||||
* @param number the number
|
||||
* @return {@code true} if {@code number} is a Smith number, otherwise false
|
||||
*/
|
||||
public static boolean isSmithNumber(int number) {
|
||||
if (PrimeCheck.isPrime(number)) {
|
||||
return false; // Smith numbers must be composite
|
||||
}
|
||||
|
||||
return SumOfDigits.sumOfDigits(number) == primeFactorDigitSum(number);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user