C ++中范围内的数字计数不超过K个非零数字

我们给定了一个从变量开始的整数范围,比方说从开始到变量结束,再到变量k,任务是计算该范围内的数字计数,以使数字不超过'k'非零数字。

例如

输入-int start = 50,end = 100 and K = 2;

输出-该范围内的数字计数所包含的位数不超过K个非零数字是:50

说明-范围是从50到100,并且给定k为2。正如我们所看到的,在50和100之间的所有数字都有2位数字,这使得除数字100之外不可能包含2个以上的零数字。这是一个3位数的数字,但也将有2个零(最多为零),因此计数为50。

输入-int start = 50,end = 100 and K = 1;

输出-范围内的数字计数,其中数字包含的数量不超过K(非零)

数字是:5

说明-范围是从50到100,并且给定k为1。如我们所见,所有介于50和100之间的数字都有2位数字,因此不超过1或k的数字为非零数字是50、60、70、80和90,因此计数为5。

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

  • 创建一个从变量start到变量end的整数范围,并声明k并输入值。将数据传递给函数以进行进一步处理。

  • 创建一个类型为vector的变量,比如说vec。

  • 启动循环,直到变量内部的值开始。现在,在while内将值val%10推入向量并将val设置为val / 10。 

  • 通过将和作为参数传递给STL,以调用STL的反向函数。vec.begin()vec.end()

  • 使用memset将数组中的值设置为-1。

  • 返回check_val(0,0,0,vec),该函数将检查数字是否为非零。

  • 在check_val函数内部:

    • 检查IF位置是否等于向量的大小,然后检查IF temp <= k,然后返回1或返回0。

    • 检查如果arr [place] [temp] [set_val]不等于-1,然后返回arr [place] [temp] [set_val]的值。

    • 声明变量以存储结果并将其设置为0。

    • 声明变量val并将其设置为9,如果set_val等于1 ELSE则将其设置为i ++

    • 从0到val值启动FOR循环

    • 在循环内部,将temp_2设置为temp并检查IF 1不等于0,然后将temp_2的值增加1并将temp_3设置为set_val并检查i小于vec [place]然后将temp_3设置为1

    • 将count的值设置为对函数check_val(place + 1,temp_2,temp_3,vec)的递归调用

    • 返回arr [place] [temp] [set_val]等于count。

示例

#include <bits/stdc++.h>
using namespace std;
int arr[20][20][2];
int K;
int check_val(int place, int temp, int set_val, vector < int > vec) {
   if (place == vec.size()) {
      if (temp <= K) {
         return 1;
      }
      return 0;
   }
   if (arr[place][temp][set_val] != -1) {
      return arr[place][temp][set_val];
   }
   int count = 0;
   int val = (set_val ? 9 : vec[place]);
   for (int i = 0; i <= val; i++) {
      int temp_2 = temp;
      if (i != 0) {
         temp_2++;
      }
      int temp_3 = set_val;
      if (i < vec[place]) {
         temp_3 = 1;
      }
      count += check_val(place + 1, temp_2, temp_3, vec);
   }
   return arr[place][temp][set_val] = count;
}

int Not_more_k(int val) {
   vector < int > vec;
   while (val) {
      vec.push_back(val % 10);
      val = val / 10;
   }
   reverse(vec.begin(), vec.end());
   memset(arr, -1, sizeof(arr));
   return check_val(0, 0, 0, vec);
}
int main() {
   int start = 50, end = 100;
   K = 2;
   int count = Not_more_k(end) - Not_more_k(start);
   cout << "范围内的数字计数所包含的位数不超过K个非零数字为: " << count;
   return 0;
}

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

输出结果

范围内的数字计数所包含的位数不超过K个非零数字为: 50

猜你喜欢