המספר הקטן ביותר עם ספירת ספרות נתונה וסכום

המספר הקטן ביותר עם ספירת ספרות נתונה וסכום
נסה את זה בתרגול GFG

ניתנו שני מספרים שלמים ג וכן ד מצא את הקטן ביותר מספר אפשרי שיש לו בדיוק D ספרות ו סכום ספרות שווה ל ג ו
להחזיר את המספר כ- חוּט ו אם אין מספר כזה חוזר '-1' ו

דוגמאות:

קֶלֶט: s = 9 d = 2
תְפוּקָה: 18
הֶסבֵּר: 18 הוא המספר הקטן ביותר האפשרי עם סכום הספרות = 9 וסך הספרות = 2.

קֶלֶט: s = 20 d = 3
תְפוּקָה: 299
הֶסבֵּר: 299 הוא המספר הקטן ביותר האפשרי עם סכום הספרות = 20 וסך הספרות = 3.

קֶלֶט: s = 1 d = 1
תְפוּקָה: 1
הֶסבֵּר: 1 הוא המספר הקטן ביותר האפשרי עם סכום הספרות = 1 וסך הספרות = 1.

טבלת תוכן

[גישת כוח ברוט] איטרציה ברצף - o (d*(10^ד)) זמן ו- O (1) שטח

מכיוון שהמספרים הם רצופים גישה לכוח ברוט חוזר מה- הקטן ביותר מספר D- ספרות ל הגדול ביותר בודק כל אחד. לכל מספר שאנו מחשבים את סכום הספרות שלו והחזיר את המשחק התקף הראשון שמבטיח את המספר הקטן ביותר האפשרי. אם לא קיים מספר תקף אנו חוזרים '-1' ו

C++
   // C++ program to find the smallest d-digit   // number with the given sum using    // a brute force approach   #include          using     namespace     std  ;   string     smallestNumber  (  int     s       int     d  )     {          // The smallest d-digit number is 10^(d-1)      int     start     =     pow  (  10       d     -     1  );          // The largest d-digit number is 10^d - 1      int     end     =     pow  (  10       d  )     -     1  ;      // Iterate through all d-digit numbers      for     (  int     num     =     start  ;     num      <=     end  ;     num  ++  )     {          int     sum     =     0       x     =     num  ;      // Calculate sum of digits      while     (  x     >     0  )     {      sum     +=     x     %     10  ;      x     /=     10  ;      }      // If sum matches return the number      // as a string      if     (  sum     ==     s  )     {      return     to_string  (  num  );      }      }      // If no valid number is found return '-1'      return     '-1'  ;   }   // Driver Code   int     main  ()     {          int     s     =     9       d     =     2  ;          cout      < <     smallestNumber  (  s       d  )      < <     endl  ;      return     0  ;   }   
Java
   // Java program to find the smallest d-digit   // number with the given sum using    // a brute force approach   import     java.util.*  ;   class   GfG     {          static     String     smallestNumber  (  int     s       int     d  )     {          // The smallest d-digit number is 10^(d-1)      int     start     =     (  int  )     Math  .  pow  (  10       d     -     1  );          // The largest d-digit number is 10^d - 1      int     end     =     (  int  )     Math  .  pow  (  10       d  )     -     1  ;      // Iterate through all d-digit numbers      for     (  int     num     =     start  ;     num      <=     end  ;     num  ++  )     {          int     sum     =     0       x     =     num  ;      // Calculate sum of digits      while     (  x     >     0  )     {      sum     +=     x     %     10  ;      x     /=     10  ;      }      // If sum matches return the number      // as a string      if     (  sum     ==     s  )     {      return     Integer  .  toString  (  num  );      }      }      // If no valid number is found return '-1'      return     '-1'  ;      }      // Driver Code      public     static     void     main  (  String  []     args  )     {          int     s     =     9       d     =     2  ;          System  .  out  .  println  (  smallestNumber  (  s       d  ));      }   }   
Python
   # Python program to find the smallest d-digit   # number with the given sum using    # a brute force approach   def   smallestNumber  (  s     d  ):   # The smallest d-digit number is 10^(d-1)   start   =   10  **  (  d   -   1  )   # The largest d-digit number is 10^d - 1   end   =   10  **  d   -   1   # Iterate through all d-digit numbers   for   num   in   range  (  start     end   +   1  ):   sum_digits   =   0   x   =   num   # Calculate sum of digits   while   x   >   0  :   sum_digits   +=   x   %   10   x   //=   10   # If sum matches return the number   # as a string   if   sum_digits   ==   s  :   return   str  (  num  )   # If no valid number is found return '-1'   return   '-1'   # Driver Code   if   __name__   ==   '__main__'  :   s     d   =   9     2   print  (  smallestNumber  (  s     d  ))   
C#
   // C# program to find the smallest d-digit   // number with the given sum using    // a brute force approach   using     System  ;   class     GfG     {          static     string     smallestNumber  (  int     s       int     d  )     {          // The smallest d-digit number is 10^(d-1)      int     start     =     (  int  )  Math  .  Pow  (  10       d     -     1  );          // The largest d-digit number is 10^d - 1      int     end     =     (  int  )  Math  .  Pow  (  10       d  )     -     1  ;      // Iterate through all d-digit numbers      for     (  int     num     =     start  ;     num      <=     end  ;     num  ++  )     {          int     sum     =     0       x     =     num  ;      // Calculate sum of digits      while     (  x     >     0  )     {      sum     +=     x     %     10  ;      x     /=     10  ;      }      // If sum matches return the number      // as a string      if     (  sum     ==     s  )     {      return     num  .  ToString  ();      }      }      // If no valid number is found return '-1'      return     '-1'  ;      }      // Driver Code      public     static     void     Main  ()     {          int     s     =     9       d     =     2  ;          Console  .  WriteLine  (  smallestNumber  (  s       d  ));      }   }   
JavaScript
   // JavaScript program to find the smallest d-digit   // number with the given sum using    // a brute force approach   function     smallestNumber  (  s       d  )     {          // The smallest d-digit number is 10^(d-1)      let     start     =     Math  .  pow  (  10       d     -     1  );          // The largest d-digit number is 10^d - 1      let     end     =     Math  .  pow  (  10       d  )     -     1  ;      // Iterate through all d-digit numbers      for     (  let     num     =     start  ;     num      <=     end  ;     num  ++  )     {          let     sum     =     0       x     =     num  ;      // Calculate sum of digits      while     (  x     >     0  )     {      sum     +=     x     %     10  ;      x     =     Math  .  floor  (  x     /     10  );      }      // If sum matches return the number      // as a string      if     (  sum     ===     s  )     {      return     num  .  toString  ();      }      }      // If no valid number is found return '-1'      return     '-1'  ;   }   // Driver Code   let     s     =     9       d     =     2  ;   console  .  log  (  smallestNumber  (  s       d  ));   

תְפוּקָה
18  

[גישה צפויה] באמצעות טכניקה חמדנית - O (D) זמן ו- O (1) שטח

הגישה מבטיחה את הספרה השמאלית ביותר הוא לא אפס אז אנחנו מילואים 1 עבור זה ולהפיץ את הסכום שנותר מ ימין לשמאל כדי ליצור את המספר הקטן ביותר האפשרי. THE גישה חמדנית מסייע בהצבת הערכים הגדולים ביותר האפשריים (עד 9) ב המיקומים הימניים ביותר כדי לשמור על המספר קטן.

שלבים ליישום הרעיון לעיל:

  • בדוק אילוצים כדי להבטיח א סכום תקף ניתן ליצור באמצעות D ספרות אחרת חזור '-1' ו
  • לְאַתחֵל תוֹצָאָה בתפקיד מחרוזת של D '0's וכן מילואים 1 עבור ספרה שמאלית ביותר על ידי צמצום s על ידי 1 ו
  • מעבר מ ימין לשמאל ולהניח את הספרה הגדולה ביותר האפשרית ( <= 9) תוך כדי עדכון ג לְפִיכָך.
  • אִם ג <= 9 מקם את ערכו במיקום הנוכחי והגדרה s = 0 כדי לעצור עדכונים נוספים.
  • הקצה את ספרה שמאלית ביותר על ידי הוספת נשאר ס כדי להבטיח שזה יישאר לא אפס ו
  • להמיר את תוֹצָאָה מחרוזת לפורמט הנדרש ו לַחֲזוֹר זה כתפוקה הסופית.
C++
   // C++ program to find the smallest d-digit    // number with the given sum using   // Greedy Technique   #include          using     namespace     std  ;   string     smallestNumber  (  int     s       int     d  )     {          // If sum is too small or too large       // for d digits      if     (  s      <     1     ||     s     >     9     *     d  )     {      return     '-1'  ;      }      string     result  (  d       '0'  );             // Reserve 1 for the leftmost digit      s  --  ;         // Fill digits from right to left      for     (  int     i     =     d     -     1  ;     i     >     0  ;     i  --  )     {          // Place the largest possible value  <= 9      if     (  s     >     9  )     {      result  [  i  ]     =     '9'  ;      s     -=     9  ;      }     else     {      result  [  i  ]     =     '0'     +     s  ;      s     =     0  ;      }      }      // Place the leftmost digit ensuring      // it's non-zero      result  [  0  ]     =     '1'     +     s  ;          return     result  ;   }   // Driver Code   int     main  ()     {          int     s     =     9       d     =     2  ;          cout      < <     smallestNumber  (  s       d  )      < <     endl  ;      return     0  ;   }   
Java
   // Java program to find the smallest d-digit    // number with the given sum using   // Greedy Technique   import     java.util.*  ;   class   GfG     {          static     String     smallestNumber  (  int     s       int     d  )     {          // If sum is too small or too large       // for d digits      if     (  s      <     1     ||     s     >     9     *     d  )     {      return     '-1'  ;      }      char  []     result     =     new     char  [  d  ]  ;      Arrays  .  fill  (  result       '0'  );          // Reserve 1 for the leftmost digit      s  --  ;      // Fill digits from right to left      for     (  int     i     =     d     -     1  ;     i     >     0  ;     i  --  )     {          // Place the largest possible value  <= 9      if     (  s     >     9  )     {      result  [  i  ]     =     '9'  ;      s     -=     9  ;      }     else     {      result  [  i  ]     =     (  char  )     (  '0'     +     s  );      s     =     0  ;      }      }      // Place the leftmost digit ensuring      // it's non-zero      result  [  0  ]     =     (  char  )     (  '1'     +     s  );          return     new     String  (  result  );      }      // Driver Code      public     static     void     main  (  String  []     args  )     {          int     s     =     9       d     =     2  ;          System  .  out  .  println  (  smallestNumber  (  s       d  ));      }   }   
Python
   # Python program to find the smallest d-digit    # number with the given sum using   # Greedy Technique   def   smallestNumber  (  s     d  ):   # If sum is too small or too large    # for d digits   if   s    <   1   or   s   >   9   *   d  :   return   '-1'   result   =   [  '0'  ]   *   d   # Reserve 1 for the leftmost digit   s   -=   1   # Fill digits from right to left   for   i   in   range  (  d   -   1     0     -  1  ):   # Place the largest possible value  <= 9   if   s   >   9  :   result  [  i  ]   =   '9'   s   -=   9   else  :   result  [  i  ]   =   str  (  s  )   s   =   0   # Place the leftmost digit ensuring   # it's non-zero   result  [  0  ]   =   str  (  1   +   s  )   return   ''  .  join  (  result  )   # Driver Code   if   __name__   ==   '__main__'  :   s     d   =   9     2   print  (  smallestNumber  (  s     d  ))   
C#
   // C# program to find the smallest d-digit    // number with the given sum using   // Greedy Technique   using     System  ;   class     GfG     {      static     string     smallestNumber  (  int     s       int     d  )     {          // If sum is too small or too large       // for d digits      if     (  s      <     1     ||     s     >     9     *     d  )     {      return     '-1'  ;      }      char  []     result     =     new     char  [  d  ];      Array  .  Fill  (  result       '0'  );      // Reserve 1 for the leftmost digit      s  --  ;      // Fill digits from right to left      for     (  int     i     =     d     -     1  ;     i     >     0  ;     i  --  )     {          // Place the largest possible value  <= 9      if     (  s     >     9  )     {      result  [  i  ]     =     '9'  ;      s     -=     9  ;      }     else     {      result  [  i  ]     =     (  char  )     (  '0'     +     s  );      s     =     0  ;      }      }      // Place the leftmost digit ensuring      // it's non-zero      result  [  0  ]     =     (  char  )     (  '1'     +     s  );          return     new     string  (  result  );      }      // Driver Code      static     void     Main  ()     {          int     s     =     9       d     =     2  ;          Console  .  WriteLine  (  smallestNumber  (  s       d  ));      }   }   
JavaScript
   // JavaScript program to find the smallest d-digit    // number with the given sum using   // Greedy Technique   function     smallestNumber  (  s       d  )     {          // If sum is too small or too large       // for d digits      if     (  s      <     1     ||     s     >     9     *     d  )     {      return     '-1'  ;      }      let     result     =     Array  (  d  ).  fill  (  '0'  );         // Reserve 1 for the leftmost digit      s  --  ;      // Fill digits from right to left      for     (  let     i     =     d     -     1  ;     i     >     0  ;     i  --  )     {          // Place the largest possible value  <= 9      if     (  s     >     9  )     {      result  [  i  ]     =     '9'  ;      s     -=     9  ;      }     else     {      result  [  i  ]     =     String  (  s  );      s     =     0  ;      }      }      // Place the leftmost digit ensuring      // it's non-zero      result  [  0  ]     =     String  (  1     +     s  );          return     result  .  join  (  ''  );   }   // Driver Code   let     s     =     9       d     =     2  ;   console  .  log  (  smallestNumber  (  s       d  ));   

תְפוּקָה
18