计算所有排列都大于C ++中该数字的自然数
我们正在以下条件下工作-
数据应仅是自然数
自然数的所有可能排列或排列应等于或大于给定数。例如,数字是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