用C ++查找具有给定位数和位数总和的最小数字

在此问题中,我们给了两个值,即和(表示数字的总和)和数字(表示数字的位数)。我们的任务是找到具有给定数字位数和总和的最小数字。

让我们举个例子来了解这个问题,

输入

sum = 15, dgiti = 2
输出结果
69

解释

总和为15的所有2位数字是:69,78,87,96。

解决方法

解决此问题的简单方法是,将所有具有数字计数的数字都视为数字,并找到数字总和等于总和的最小数字。

一个有效的解决方案是使用贪婪方法。我们将通过填充最后一位数字(即数字的LSB)中的元素来创建数字。我们将考虑LSB的最大可能元素,然后再转到下一个位置。

我们将尝试使LSB尽可能大,MSB尽可能小。

该程序说明了我们解决方案的工作原理,

示例

#include <iostream>
using namespace std;
void findSmallestNumWithSum(int digit, int sum) {
   if (sum == 0) {
      if(digit == 1)
         cout<<"最小的数字是 0";
      else
         cout<<"Smallest number with sum cannot be found";
      return ;
   }
   if (sum > 9*digit) {
      cout<<"Smallest number with sum cannot be found";
      return ;
   }
   int number[digit];
   sum -= 1;
   for (int i = digit-1; i>0; i--) {
      if (sum > 9) {
         number[i] = 9;
         sum -= 9;
      } else {
         number[i] = sum;
         sum = 0;
      }
   }
   number[0] = sum + 1;
   cout<<"最小的数字是 ";
   for (int i=0; i<digit; i++)
      cout<<number[i];
}
int main() {
   int sum = 15, digit = 3;
   findSmallestNumWithSum(digit, sum);
   return 0;
}
输出结果
最小的数字是 159