forked from TheAlgorithms/Java
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLuckyNumber.java
More file actions
78 lines (65 loc) · 2.56 KB
/
LuckyNumber.java
File metadata and controls
78 lines (65 loc) · 2.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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
}
}