C++中计算区间内能被m整除且偶数位包含数字d的数字个数
给定一个整数区间、一个用作除数的变量m和一个用于检查数字'd'是否位于偶数位的变量d,任务是计算区间内能被变量m整除且偶数位包含数字d的数字个数。
例如
输入 - int start = 20, end = 50, d = 8, m = 4
输出 - 区间内能被m整除且偶数位包含数字d的数字个数为:2
解释 - 区间从20到50。因此,包含数字d(即8)的可能数字是28、38和48,其中8位于偶数位(即第2位),数字24和48能被m(即4)整除,因此个数为2。
输入 - int start = 10, end = 100, d = 6, m = 2
输出 - 区间内能被m整除且偶数位包含数字d的数字个数为:8
解释 - 区间从10到100。因此,包含数字d(即6)的可能数字是16、26、36、46、56、66、76、86和96,其中6位于偶数位,除了6和66(6位于奇数位),我们不包含这些数字。现在,我们将检查列表中能被2整除的数字,因此所有数字(即16、26、36、46、56、76、86和96)都能被2整除,因此个数为8。
下面程序中使用的算法如下
- 创建一个从变量start到变量end的整数数字范围,并声明变量d和m并输入值。将数据传递给函数以进行进一步处理。
- 创建一个向量类型的变量,例如vec。
- 启动while循环,直到值为变量start中的值。现在,在while循环内部,将值val % 10压入向量中,并将val设置为val / 10。
- 通过传递vec.begin()和vec.end()作为参数,调用STL中的reverse函数。
- 使用memset将数组中的值设置为-1。
- 返回set_total(0, 0, 0, vec),这是一个将检查数字的偶数位是否为d且能被m整除的函数。
- 在set_total函数内部 -
- 检查IF place等于向量的size,然后检查IF temp = 0,则返回1或返回0。
- 检查IF 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
- 声明一个变量count来存储结果。
- 声明一个变量set_limit,如果val等于1,则将其设置为9,否则将其设置为vec[place]。
- 从i = 0开始循环到set_limit,并检查IF i等于d,则继续。
- 声明一个变量temp_2并将其设置为val
- 检查IF i小于vec[place],则将temp_2设置为1
- 使用对set_total函数的递归调用设置count
- 返回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 << "Count of Numbers in a Range divisible by m and having digit d in even positions are: " << count;
return 0;
}如果我们运行上述代码,它将生成以下输出:
输出
Count of Numbers in a Range divisible by m and having digit d in even positions are: 2
广告
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP