Keith Nummer

Keith Nummer
Probieren Sie es bei GfG Practice aus #practiceLinkDiv { display: none !important; }

Eine n-stellige Zahl x wird Keith-Zahl genannt, wenn sie in einer speziellen Reihenfolge (unten definiert) erscheint, die aus ihren Ziffern generiert wird. Die spezielle Sequenz hat die ersten n Terme als Ziffern von x und andere Terme werden rekursiv als Summe der vorherigen n Terme ausgewertet.
Die Aufgabe besteht darin, herauszufinden, ob eine bestimmte Zahl eine Keith-Zahl ist oder nicht.
Beispiele:  
 

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   ... 


 

Empfohlene Praxis Keith Nummer Probieren Sie es aus!


Algorithmus:  
 

  1. Speichern Sie die 'n' Ziffern der gegebenen Zahl 'x' in einem Array 'terms'.
  2. Schleife zum Erzeugen der nächsten Terme der Sequenz und zum Hinzufügen der vorherigen „n“ Terme.
  3. Speichern Sie weiterhin die next_terms aus Schritt 2 im Array „terms“.
  4. Wenn der nächste Term gleich x wird, ist x eine Keith-Zahl. Wenn der nächste Term größer als x wird, ist x keine Keith-Zahl.


 

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      < <     'Yes  n  '     :     cout      < <     'No  n  '  ;      isKeith  (  12  )  ?     cout      < <     'Yes  n  '     :     cout      < <     'No  n  '  ;      isKeith  (  197  )  ?     cout      < <     'Yes  n  '     :     cout      < <     'No  n  '  ;      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  (  1    n  +  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  (  'Yes  n  '  )   :   print  (  'No  n  '  );   isKeith  (  12  )   ?   print  (  'Yes  n  '  )   :   print  (  'No  n  '  );   isKeith  (  197  )   ?   print  (  'Yes  n  '  )   :   print  (  'No  n  '  );   // 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>

Ausgabe:  

Yes No Yes 

Zeitkomplexität: O(n^2) wobei n die Anzahl der Ziffern ist

Hilfsraum: An)