在C ++中,数字d恰好发生K次的范围内的数字计数

我们给定了一个从变量开始的整数范围,比方说从开始到变量结束,再到变量k和d。任务是计算一定范围内的位数d,以使d恰好出现k次。

例如

输入 -int开始= 10,int结束= 100,d = 4且K = 2

输出-数字d恰好出现K次的范围内的数字计数是:1

说明-范围从10到100。因此,数字d即4的可能数字恰好出现k,即2乘以44,因此计数为1。

输入-int start = 10,end = 100,d = 6 and m = 1

输出-数字d恰好出现K次的范围内的数字计数是:1

说明-范围是从10到100。因此,数字d即4的可能数字恰好出现在k上,即1时间在16、26、36、46、56、76、86和96中,因此计数为8。我们不认为66是因为6发生的次数超过k次。

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

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

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

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

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

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

  • 返回set_total(0,0,0,vec),此函数将检查位置d为偶数且可以被m整除的数字 

  • 在set_total函数内部:

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

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

    • 声明一个变量计数以存储结果。

    • 声明变量temp_2并将其设置为9,如果val等于1 ELSE则通过vec [place]对其进行设置。

    • 从i到0直到temp_2开始FOR循环,并检查IF是否等于d,然后检查IF注意是否等于0或d为0且rem = 1然后将总数加1 

    • 将变量声明为temp_2并将其设置为val

    • 检查i是否小于vec [place],然后将temp_2设置为1

    • 通过对函数set_total的递归调用来设置计数

    • 返回arr [place] [temp] [val] = count。

示例

#include <bits/stdc++.h>
using namespace std;

const int MAX = 20;
int arr[MAX][MAX][2][2];
int d, K;

int set_total(int place, int temp, int val, int rem, vector < int > vec) {
   if (place == vec.size()) {
      if (temp == K) {
         return 1;
      }
      return 0;
   }
   if (arr[place][temp][val][rem] != -1) {
      return arr[place][temp][val][rem];
   }
   int count = 0;
   int temp_2 = (val ? 9 : vec[place]);

   for (int i = 0; i <= temp_2; i++) {
      int total = temp;
      if (i == d) {
         if (d != 0 || (!d && rem)) {
            total++;
         }
      }
      int total_2 = val;
      if (i < vec[place]) {
         total_2 = 1;
      }
      count += set_total(place + 1, total, total_2, rem || (i != 0), vec);
   }
   return arr[place][temp][val][rem] = count;
}

int occurrence_d(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 set_total(0, 0, 0, 0, vec);
}
int main() {
   int start = 10;
   int end = 100;
   d = 4, K = 2;
   int count = occurrence_d(end) - occurrence_d(start - 1);
   cout << "数字d恰好出现K次的范围内的数字计数为: " << count;
   return 0;
}

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

输出结果

数字d恰好出现K次的范围内的数字计数为: 1

猜你喜欢