在C ++中以给定的数字总和计数数字(小于或等于N)

给定一个包含数字和总和的字符串str作为输入。目标是找到直至str的数字总和等于总数的数字。

让我们通过示例来理解。

例如

输入-N =“ 110”和= 5

输出-具有给定数字总和的小于或等于N的数字计数为:7

说明-直到110的数字总和等于5的数字是:-

5、14、23、32、41、50和104。

输入-N =“ 1000” sum = 3

输出-具有给定数字总和的小于或等于N的数字计数为:10

说明-直到1000的数字之和等于3的数字是:-

3、12、21、30、102、111、120、201、210和300。

以下程序中使用的方法如下

在这种方法中,我们将使用动态编程将数字和其数字的总和存储在数组arr [18] [2] [162]中。这里18表示最大的18位数字,2表示值0和1。并且162表示如果所有18位数字均为9(18 * 9 = 162),则可能的最大和。 

元素arr [i] [j] [k]的值表示根据i个数字的当前构造数是小于还是大于i中的第一个i数来考虑前i个数字并且j为0或1的数字计数。 N。(如果N为123并且i为2,那么我们将检查2个数字是否等于或大于12。如果等于12,则j将为1,否则j在arr [i] [j] [k中将为0 ])。索引k将是arr [i] [j] [k]中i个数字的总和。

如果i = N的数字且k =输入和,则结果将为1,否则为0。

为了填充下一个数字(i + 1th),我们将检查j。如果j为1,则i-1数字等于N的i-1数字,因此下一个数字只能具有介于N的第0到i + 1数字之间的值,以使其<=N。

如果j为0,则i-1位数小于N中的i-1位数。因此,对于下一个数字(i + 1 th)位置,我们可以将0到9之间的任何值放置,并且该数值仍小于N.

最后返回结果作为最终计数。

  • 取代表数字N的字符串str,并将总数作为数字的总和。

  • 取数组arr [18] [2] [162]并使用memset将其初始化为-1。

  • 函数以count_digits(int i, bool check, int temp, int total, string str, int size)递归方式填充arr [] [] [],最后以给定的数字总和返回小于或等于N的数字的计数。

  • 如果当前位数i等于N位数并且当前总和温度等于输入总和,则返回1,否则返回0。

  • 取count = arr [i] [check] [temp]。如果不是-1,则返回count作为结果。

  • 取临时变量check_2(bool)和temp_2。(int)。

  • 使用for循环遍历数字0到9,并比较check是1还是0。如果为1,则将当前数字ch与str [i]进行比较。如果更大,则中断循环(不执行任何操作)。

  • 设置check_2 =检查|| ch <str [i]。

  • 将temp_2 = temp +(ch-'0')设置为当前总和。

  • 添加count_digits(i + 1,check_2,temp_2,total,str,size)进行计数以递归计算数字总和。

  • 最后返回结果作为计数。

示例

#include <bits/stdc++.h>
using namespace std;
int arr[18][2][162];
int count_digits(int i, bool check, int temp, int total, ing str, int size) {
   if (i == size) {
      if (temp == total) {
         return 1;
      } else {
         return 0;
      }
   }
   int count = arr[i][check][temp];
   if (count != -1) {
      return count;
   }
   count = 0;
   bool check_2;
   int temp_2;
   for (char ch = '0'; ch <= '9'; ch++) {
      if (!check) {
         if (ch > str[i]) {
            break;
         }
      }
      check_2 = check || ch < str[i];
      temp_2 = temp + (ch - '0');
      count += count_digits(i + 1, check_2, temp_2, total, str, size);
   }
   return count;
}
int main() {
   string str = "1101";
   int size = str.size();
   int total = 5;
   memset(arr, -1, sizeof(arr));
   cout << "具有给定数字总和的小于或等于N的数字计数为: " << count_digits(0, 0, 0, total, str, size);
   return 0;
}

如果我们运行上面的代码,它将生成以下输出-

输出结果

具有给定数字总和的小于或等于N的数字计数为: 26

猜你喜欢