我们正在以下条件下工作-
数据应仅是自然数
自然数的所有可能排列或排列应等于或大于给定数。例如,数字是20
考虑从1开始的直到20的所有数字,即1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16、17、18、19、20
现在检查那些排列或排列等于或大于给定数字(即20)的数字。数字为1、2、3、4、5、6、7、8、9、11 = 11、12 <21、13 <31 ,14 <41、15 <51、16 <61、17 <71、18 <81、19 <91。因此计数为18。
输入-num = 10
输出-计数为9
说明-数字1、2、3、4、5、6、7、8、9是等于以任何方式排列时的数字。
输入-num = 13
输出-计数为12
解释-数字1、2、3、4、5、6、7、8、9、11、12 <21、13 <31是等于或大于以任何方式排列的数字。
输入数字num的值
将max_size设置为9,因为将始终至少有9个数字,其排列等于或大于数字本身。
从0到max_size开始循环
在循环内,创建一个列表类型变量,并检查i是否小于或等于num(如果是),然后将i插入列表并将计数加1
从头到尾遍历列表,从第一个元素到9开始另一个循环。
检查是否temp <= num,然后将temp推到列表的最前面,并将计数增加1
返回计数
打印结果。
#include<bits/stdc++.h> using namespace std; //计算自然数的函数,其 //所有排列都大于该数字 void count(int num){ int count = 0; int max_size = 9; for (int i = 1; i <= max_size; i++){ list<int> lists; if (i <= num){ //在列表末尾插入元素 lists.push_back(i); count = count + 1; } //迭代器从列表的末尾开始 for(auto iter = lists.end(); iter != lists.begin(); ++iter){ int first_ele = lists.front(); lists.pop_front(); for (int next = first_ele%10; next <= 9; next++){ int temp = first_ele*10 + next; if (temp <= num){ lists.push_front(temp); count++; } } } } cout<<"count of num "<<num <<" is "<<count<<endl; } int main(){ count(1); count(9); count(7); count(0); count(12); return 0; }
输出结果
如果运行上面的代码,我们将获得以下输出-
count of num 1 is 1 count of num 9 is 9 count of num 7 is 7 count of num 0 is 0 count of num 12 is 11