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