mirror of
https://github.com/TheAlgorithms/Java.git
synced 2026-03-13 08:40:43 +08:00
79 lines
2.6 KiB
Java
79 lines
2.6 KiB
Java
package com.thealgorithms.maths;
|
|
|
|
/**
|
|
* In number theory, a lucky number is a natural number in a set which is generated by a certain "sieve".
|
|
* This sieve is similar to the sieve of Eratosthenes that generates the primes,
|
|
* but it eliminates numbers based on their position in the remaining set,
|
|
* instead of their value (or position in the initial set of natural numbers).
|
|
*
|
|
* Wiki: https://en.wikipedia.org/wiki/Lucky_number
|
|
*/
|
|
public final class LuckyNumber {
|
|
|
|
private LuckyNumber() {
|
|
}
|
|
|
|
// Common validation method
|
|
private static void validatePositiveNumber(int number) {
|
|
if (number <= 0) {
|
|
throw new IllegalArgumentException("Number must be positive.");
|
|
}
|
|
}
|
|
|
|
// Function to check recursively for Lucky Number
|
|
private static boolean isLuckyRecursiveApproach(int n, int counter) {
|
|
// Base case: If counter exceeds n, number is lucky
|
|
if (counter > n) {
|
|
return true;
|
|
}
|
|
|
|
// If number is eliminated in this step, it's not lucky
|
|
if (n % counter == 0) {
|
|
return false;
|
|
}
|
|
|
|
// Calculate new position after removing every counter-th number
|
|
int newNumber = n - (n / counter);
|
|
|
|
// Recursive call for next round
|
|
return isLuckyRecursiveApproach(newNumber, counter + 1);
|
|
}
|
|
|
|
/**
|
|
* Check if {@code number} is a Lucky number or not using recursive approach
|
|
*
|
|
* @param number the number
|
|
* @return {@code true} if {@code number} is a Lucky number, otherwise false
|
|
*/
|
|
public static boolean isLuckyNumber(int number) {
|
|
validatePositiveNumber(number);
|
|
int counterStarting = 2;
|
|
return isLuckyRecursiveApproach(number, counterStarting);
|
|
}
|
|
|
|
/**
|
|
* Check if {@code number} is a Lucky number or not using iterative approach
|
|
*
|
|
* @param number the number
|
|
* @return {@code true} if {@code number} is a Lucky number, otherwise false
|
|
*/
|
|
public static boolean isLucky(int number) {
|
|
validatePositiveNumber(number);
|
|
|
|
int counter = 2; // Position starts from 2 (since first elimination happens at 2)
|
|
int position = number; // The position of the number in the sequence
|
|
|
|
while (counter <= position) {
|
|
if (position % counter == 0) {
|
|
return false;
|
|
} // Number is eliminated
|
|
|
|
// Update the position of n after removing every counter-th number
|
|
position = position - (position / counter);
|
|
counter++;
|
|
}
|
|
|
|
return true; // Survives all eliminations → Lucky Number
|
|
}
|
|
}
|