-
Notifications
You must be signed in to change notification settings - Fork 32
/
lucky_no Algo.txt
123 lines (84 loc) · 3.88 KB
/
lucky_no Algo.txt
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
Lucky Numbers
Last Updated: 16-10-2020
Lucky numbers are subset of integers. Rather than going into much theory, let us see the process of arriving at lucky numbers,
Take the set of integers
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,……
First, delete every second number, we get following reduced set.
1,3,5,7,9,11,13,15,17,19,…………
Now, delete every third number, we get
1, 3, 7, 9, 13, 15, 19,….….
Continue this process indefinitely……
Any number that does NOT get deleted due to above process is called “lucky”.
Therefore, set of lucky numbers is 1, 3, 7, 13,………
Now, given an integer ‘n’, write a function to say whether this number is lucky or not.
bool isLucky(int n)
Recommended: Please solve it on “PRACTICE ” first, before moving on to the solution.
Algorithm:
Before every iteration, if we calculate position of the given number, then in a given iteration, we can determine if the number will be deleted. Suppose calculated position for the given number is P before some iteration, and each Ith number is going to be removed in this iteration, i
f P < I then input number is lucky,
if P is such that P%I == 0 (I is a divisor of P), then input no is not lucky.
How to calculate Next position of the number:
We know that initially the position of the number is nth itself. Now any next position will be equal to the previous position minus the number of elements (or say items) removed.
That is, next_position = current_position – count of numbers removed
For example, take the case of n=13.
We have: Initial position: n, ie. 13 itself.
1,2,3,4,5,6,7,8,9,10,11,12,13
Now after removing every second elements , we actually removed n/2 elements. So now the position of 13 will be : n-n/2=13-6=7 (n=13), i=2
1,3,5,7,9,11,13.
After that, we remove n/3 items. Note that n now is n=7. So position of 13 : n-n/3 = 7-7/3 = 7-2 = 5 (n=7), i=3
1,3,7,9,13
So next it will be : n-n/4 = 5-5/4 = 4 (n=5), i=4
1,3,7,13
So now i=5, but since position of 13 is 4 only, so it will be saved. Hence a lucky number! n=4, i=5
Recursive Way:
filter_none
edit
play_arrow
brightness_4
// C++ program for Lucky Numbers
#include <bits/stdc++.h>
using namespace std;
#define bool int
/* Returns 1 if n is a lucky no.
otherwise returns 0*/
bool isLucky(int n)
{
static int counter = 2;
/*variable next_position is just for
readability of the program we can
remove it and use n only */
int next_position = n;
if(counter > n)
return 1;
if(n % counter == 0)
return 0;
/*calculate next position of input no*/
next_position -= next_position / counter;
counter++;
return isLucky(next_position);
}
// Driver Code
int main()
{
int x = 5;
if( isLucky(x) )
cout << x << " is a lucky no.";
else
cout << x << " is not a lucky no.";
}
// This code is contributed
// by rathbhupendra
Output:
5 is not a lucky no.
Example:
Let’s us take an example of 19
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,15,17,18,19,20,21,……
1,3,5,7,9,11,13,15,17,19,…..
1,3,7,9,13,15,19,……….
1,3,7,13,15,19,………
1,3,7,13,19,………
In next step every 6th no .in sequence will be deleted. 19 will not be deleted after this step because position of 19 is 5th after this step. Therefore, 19 is lucky. Let’s see how above C code finds out:
Current function call Position after this call Counter for next call Next Call isLucky(19 ) 10 3 isLucky(10) isLucky(10) 7 4 isLucky(7) isLucky(7) 6 5 isLucky(6) isLucky(6) 5 6 isLucky(5)
When isLucky(6) is called, it returns 1 (because counter > n).
Please write comments if you find any bug in the given programs or other ways to solve the same problem.
Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.