logo

Numéro Keith

Essayez-le sur GfG Practice ' title= #practiceLinkDiv { display : aucun !important; }

Un nombre x à n chiffres est appelé numéro de Keith s'il apparaît dans une séquence spéciale (définie ci-dessous) générée à l'aide de ses chiffres. La séquence spéciale a les n premiers termes comme chiffres de x et les autres termes sont évalués de manière récursive comme la somme des n termes précédents.
La tâche consiste à trouver si un nombre donné est le numéro Keith ou non.
Exemples :  
 

Input : x = 197 Output : Yes 197 has 3 digits so n = 3 The number is Keith because it appears in the special sequence that has first three terms as 1 9 7 and remaining terms evaluated using sum of previous 3 terms. 1 9 7 17 33 57 107   197   ..... Input : x = 12 Output : No The number is not Keith because it doesn't appear in the special sequence generated using its digits. 1 2 3 5 8 13 21 ..... Input : x = 14 Output : Yes 14 is a Keith number since it appears in the sequence 1 4 5 9   14   ...


 

Pratique recommandée Numéro Keith Essayez-le !


Algorithme:  
 



  1. Stockez les « n » chiffres du nombre « x » donné dans un tableau « termes ».
  2. Boucle pour générer les termes suivants de la séquence et ajouter les « n » termes précédents.
  3. Continuez à stocker les next_terms de l'étape 2 dans le tableau 'terms'.
  4. Si le terme suivant devient égal à x alors x est un nombre de Keith. Si le terme suivant devient supérieur à x, alors x n'est pas un nombre de Keith.


 

C++
// C++ program to check if a number is Keith or not #include   using namespace std; // Returns true if x is Keith else false. 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 terms of a sequence generated  // using digits of x until we either reach x or a  // number greater 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); } // Driver program int main() {  isKeith(14)? cout << 'Yesn' : cout << 'Non';  isKeith(12)? cout << 'Yesn' : cout << 'Non';  isKeith(197)? cout << 'Yesn' : cout << 'Non';  return 0; } 
Java
// Java program to check if a number is Keith or not import java.io.*;  import java.util.*; class GFG{ // Returns true if x is Keith else false. static boolean isKeith(int x) {  // Store all digits of x in a vector 'terms'  // Also find number of digits and store in 'n'.  ArrayList<Integer> terms=new ArrayList<Integer>();  int temp = x n = 0; // n is number of digits in x  while (temp > 0)  {  terms.add(temp%10);  temp = temp/10;  n++;  }  // To get digits in right order (from MSB to  // LSB)  Collections.reverse(terms);  // Keep finding next terms of a sequence generated  // using digits of x until we either reach x or a  // number greater 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.get(i-j);  terms.add(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); } // Driver program public static void main(String[] args) { if (isKeith(14)) System.out.println('Yes'); else  System.out.println('No'); if(isKeith(12))  System.out.println('Yes'); else System.out.println('No'); if(isKeith(197))  System.out.println('Yes'); else System.out.println('No'); } } // this code is contributed by mits 
Python3
# Python3 program to check if a number  # is Keith or not  # Returns true if x is Keith  # else false.  def isKeith(x): # Store all digits of x in a vector 'terms'  # Also find number of digits and store in 'n'.  terms = []; temp = x; n = 0; # n is number of digits in x  while (temp > 0): terms.append(temp % 10); temp = int(temp / 10); n+=1; # To get digits in right order  # (from MSB to LSB)  terms.reverse(); # Keep finding next terms of a sequence  # generated using digits of x until we  # either reach x or a number greater than x  next_term = 0; i = n; while (next_term < x): next_term = 0; # Next term is sum of previous n terms  for j in range(1n+1): next_term += terms[i - j]; terms.append(next_term); i+=1; # 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); # Driver Code  print('Yes') if (isKeith(14)) else print('No'); print('Yes') if (isKeith(12)) else print('No'); print('Yes') if (isKeith(197)) else print('No'); # This code is contributed by mits 
C#
// C# program to check if a number is Keith or not using System;  using System.Collections; class GFG{ // Returns true if x is Keith else false. static bool isKeith(int x) {  // Store all digits of x in a vector 'terms'  // Also find number of digits and store in 'n'.  ArrayList terms = new ArrayList();  int temp = x n = 0; // n is number of digits in x  while (temp > 0)  {  terms.Add(temp%10);  temp = temp/10;  n++;  }  // To get digits in right order (from MSB to  // LSB)  terms.Reverse();  // Keep finding next terms of a sequence generated  // using digits of x until we either reach x or a  // number greater 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 += (int)terms[i-j];  terms.Add(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); } // Driver program public static void Main() { if (isKeith(14)) Console.WriteLine('Yes'); else Console.WriteLine('No'); if(isKeith(12))  Console.WriteLine('Yes'); else Console.WriteLine('No'); if(isKeith(197))  Console.WriteLine('Yes'); else Console.WriteLine('No'); } } // this code is contributed by mits 
PHP
 // PHP program to check if a number  // is Keith or not // Returns true if x is Keith // else false. function isKeith($x) { // Store all digits of x in a vector 'terms' // Also find number of digits and store in 'n'. $terms = array(); $temp = $x; $n = 0; // n is number of digits in x while ($temp > 0) { array_push($terms $temp % 10); $temp = (int)($temp / 10); $n++; } // To get digits in right order  // (from MSB to LSB) $terms=array_reverse($terms); // Keep finding next terms of a sequence  // generated using digits of x until we  // either reach x or a number greater than x $next_term = 0; $i = $n; while ($next_term < $x) { $next_term = 0; // Next term is sum of previous n terms for ($j = 1; $j <= $n; $j++) $next_term += $terms[$i - $j]; array_push($terms $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); } // Driver Code isKeith(14) ? print('Yesn') : print('Non'); isKeith(12) ? print('Yesn') : print('Non'); isKeith(197) ? print('Yesn') : print('Non'); // This code is contributed by mits ?> 
JavaScript
<script> // Javascript program to check if a number // is Keith or not // Returns true if x is Keith // else false. function isKeith(x) {  // Store all digits of x in a vector 'terms'  // Also find number of digits and store in 'n'.  let terms = [];  let temp = x;  let n = 0; // n is number of digits in x  while (temp > 0)  {  terms.push(temp % 10);  temp = parseInt(temp / 10);  n++;  }  // To get digits in right order  // (from MSB to LSB)  terms= terms.reverse();  // Keep finding next terms of a sequence  // generated using digits of x until we  // either reach x or a number greater than x  let next_term = 0;  let i = n;  while (next_term < x)  {  next_term = 0;  // Next term is sum of previous n terms  for (let j = 1; j <= n; j++)  next_term += terms[i - j];  terms.push(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); } // Driver Code isKeith(14) ? document.write('Yes  
'
) : document.write('No
'
); isKeith(12) ? document.write('Yes
'
) : document.write('No
'
); isKeith(197) ? document.write('Yes
'
) : document.write('No
'
); // This code is contributed by _saurabh_jaiswal </script>

Sortir:  

Yes No Yes

Complexité temporelle : O(n^2) où n est un nombre de chiffres

Espace auxiliaire : Sur)