计算所有排列都大于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