我们给定了一个从变量开始的整数范围,比方说从开始到变量结束,再到变量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