Keith Number - GeeksforGeeks
A n digit number x is called Keith number if it appears in a special sequence (defined below) generated using its digits. The special sequence has first n terms as digits of x and other terms are recursively evaluated as sum of previous n terms.
The task is to find if a given number is Keith Number or not.
Read full article from Keith Number - GeeksforGeeks
A n digit number x is called Keith number if it appears in a special sequence (defined below) generated using its digits. The special sequence has first n terms as digits of x and other terms are recursively evaluated as sum of previous n terms.
The task is to find if a given number is Keith Number or not.
- Store the ‘n’ digits of given number “x” in an array “terms”.
- Loop for generating next terms of sequence and adding the previous ‘n’ terms.
- Keep storing the next_terms from step 2 in array “terms”.
- If the next term becomes equal to x, then x is a Keith number. If next term becomes more than x, then x is not a Keith Number.
bool isKeith(
int
x)
{
// Store all digits of x in a vector "terms"
// Also find number of digits and store in "n".
vector <
int
> terms;
int
temp = x, n =
0
;
// n is number of digits in x
while
(temp >
0
)
{
terms.push_back(temp%
10
);
temp = temp/
10
;
n++;
}
// To get digits in right order (from MSB to
// LSB)
reverse(terms.begin(), terms.end());
// Keep finding next trms of a sequence generated
// using digits of x until we either reach x or a
// number greate than x
int
next_term =
0
, i = n;
while
(next_term < x)
{
next_term =
0
;
// Next term is sum of previous n terms
for
(
int
j=
1
; j<=n; j++)
next_term += terms[i-j];
terms.push_back(next_term);
i++;
}
/* When the control comes out of the while loop,
either the next_term is equal to the number
or greater than it.
If next_term is equal to x, then x is a
Keith number, else not */
return
(next_term == x);
}