在C ++中被m整除并且在偶数位置具有d的范围内的数字计数

给定一个整数范围,一个变量m用作除数,一个变量d用来检查数字“ d”是否在偶数位置,任务是计算a中这些数字的计数。变量m可除的范围,偶数位置为d。

例如

输入-int开始= 20,结束= 50,d = 8且m = 4

输出-被m整除并且在偶数位置具有d的范围内的数字计数是:2

说明-范围是从20到50。因此,数字d即8的可能数字是28、38和48,偶数位置即8,即8,数字24和48可被m除以即4,因此计数为2 。

输入-int开始= 10,结束= 100,d = 6且m = 2

输出-被m整除并且在偶数位置具有d的范围内的数字计数是:8

说明-范围从10到100。所以数字d的可能数字即6、16、26、36、46、56、66、76、86和96在偶数位置具有6,而数字6和66除外。处于奇数位置,因此我们将不包括此位置,现在我们将检查列表中可被2整除的数字,以便所有数字(即16,26、36、46、56、76、86和96可被2整除)计数是8。

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

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

  • 创建一个类型为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_totalfunction-内部:

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

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

    • 检查IF place%2 = 1,然后检查IF val = 0,然后检查IF d是否大于vec [place],然后返回0

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

    • 检查IF d小于vec [place],然后将temp_2设置为1。

    • 声明变量temp_3并对该进行递归调用,set_total()并返回arr [place] [temp] [val] = temp_3

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

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

    • 从i到0开始执行FOR循环,直到set_limit并检查i是否等于d,然后继续 

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

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

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

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

示例

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

int arr[20][20][2];
int d, m;

int set_total(int place, int temp, int val, vector < int > vec) {
   if (place == vec.size()) {
      if (temp == 0) {
         return 1;
      }
      return 0;
   }
   if (arr[place][temp][val] != -1) {
      return arr[place][temp][val];
   }
   if (place % 2) {
      if (val == 0) {
         if (d > vec[place]) {
            return 0;
         }
      }
      int temp_2 = val;
      if (d < vec[place]) {
         temp_2 = 1;
      }
      int temp_3 = set_total(place + 1, (10 * temp + d) % m, temp_2, vec);
      return arr[place][temp][val] = temp_3;
   }
   int count = 0;
   int set_limit = (val ? 9 : vec[place]);
   for (int i = 0; i <= set_limit; i++) {
      if (i == d) {
         continue;
      }
      int temp_2 = val;
      if (i < vec[place]) {
         temp_2 = 1;
      }
      count += set_total(place + 1, (10 * temp + i) % m, temp_2, vec);
   }
   return arr[place][temp][val] = count;
}

int divisible(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, vec);
}
int main() {
   int start = 20, end = 50;
   d = 8, m = 4;
   int count = divisible(end) - divisible(start);
   cout << "被m整除并且在偶数位置具有d的范围内的数字计数为: " << count;
   return 0;
}

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

输出结果

被m整除并且在偶数位置具有d的范围内的数字计数为: 2

猜你喜欢