logo

Cel mai mic număr cu numărul de cifre dat și sumă

Încercați -l în practica GFG ' title=

Având două numere întregi s şi D. Găsiți cel mai mic Număr posibil care are exact d cifre și a suma cifrelor egal cu s .
Returnează numărul ca a şir . Dacă nu există un astfel de număr '-1' .

Exemple:



Intrare: s = 9 d = 2
Ieșire: 18
Explicaţie: 18 este cel mai mic număr posibil cu suma cifrelor = 9 și cifre totale = 2.

Intrare: s = 20 d = 3
Ieșire: 299
Explicaţie: 299 este cel mai mic număr posibil cu suma cifrelor = 20 și cifre totale = 3.

Intrare: s = 1 d = 1
Ieșire: 1
Explicaţie: 1 este cel mai mic număr posibil cu suma cifrelor = 1 și cifre totale = 1.



Tabel de conținut

[Abordare Brute -Force] Iterați secvențial - O (D*(10^D)) Timp și O (1) Spațiu

Deoarece numerele sunt secvențiale, Abordarea forței brute iterează din cel mai mic Numărul d-digit la cel mai mare verificând fiecare. Pentru fiecare număr, calculăm suma cifrelor sale și returnează prima potrivire valabilă, asigurând că este selectat cel mai mic număr posibil. Dacă nu există un număr valid, returnăm '-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)); 

Ieșire
18 

[Abordare preconizată] folosind tehnica lacomă - O (d) Timpul și spațiul O (1)

Abordarea asigură cifra cea mai stângă este non-zero Deci noi Rezerva 1 pentru aceasta și distribuie suma rămasă din dreapta la stânga pentru a forma cel mai mic număr posibil. Abordare lacomă ajută la plasarea celor mai mari valori posibile (până la 9) la poziții cele mai drepte pentru a menține numărul mic.



Pași pentru implementarea ideii de mai sus:

  • Verificați constrângerile pentru a vă asigura un sumă valabilă s poate fi format folosind d cifre altfel se întoarce '-1' .
  • Inițializează rezultat ca un șir de D '0's şi Rezerva 1 pentru cifra cea mai stângă prin reducerea s de 1 .
  • Traverse din dreapta la stânga și așezați cea mai mare cifră posibilă (<= 9) În timp ce actualizați s în consecinţă.
  • Dacă s<= 9 Puneți valoarea sa la poziția curentă și setați -vă S = 0 Pentru a opri actualizări suplimentare.
  • Alocați cifra cea mai stângă Prin adăugarea rămase s pentru a se asigura că rămâne non-zero .
  • Convertiți rezultat șir la formatul necesar și reveni ca ieșire finală.
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)); 

Ieșire
18