C ++中范围内的数字计数不超过K个非零数字
我们给定了一个从变量开始的整数范围,比方说从开始到变量结束,再到变量k,任务是计算该范围内的数字计数,以使数字不超过'k'非零数字。
例如
输入-intstart=50,end=100andK=2;
输出-该范围内的数字计数所包含的位数不超过K个非零数字是:50
说明-范围是从50到100,并且给定k为2。正如我们所看到的,在50和100之间的所有数字都有2位数字,这使得除数字100之外不可能包含2个以上的零数字。这是一个3位数的数字,但也将有2个零(最多为零),因此计数为50。
输入-intstart=50,end=100andK=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位置是否等于向量的大小,然后检查IFtemp<=k,然后返回1或返回0。
检查如果arr[place][temp][set_val]不等于-1,然后返回arr[place][temp][set_val]的值。
声明变量以存储结果并将其设置为0。
声明变量val并将其设置为9,如果set_val等于1ELSE则将其设置为i++
从0到val值启动FOR循环
在循环内部,将temp_2设置为temp并检查IF1不等于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