解释都在代码注释里了。思路其实很简单,就是判断数位,若下一个数位还在范围内就移到下一位,若下一数位不满足了,就在当前数位开始判断,当前数位不满足了,就回到上一个数位。
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int A[100];//存储字典序的数组(也可以不用数组,直接输出)
int num = 1, k = 1;//num表示当前判断的数字(从1开始),k表示已经得到的字典序数字的个数
A[0] = 1;//第一个数当然为1
for (; k < n;)//总共有n个数,所以有n层循环(实际上是n-1层,第一个数为1,不用找)
{
if (num * 10 <= n)
{//字典序的下一位数字是0,如果这个数小于n,则满足,输入到数组中
num *= 10;
A[k++] = num;
continue;//数已经找到,进入下一层循环,继续找下一个字典序数
}
else
{//如果不满足,就从这个数位开始判断
while ((num + 1 > n || num % 10 == 9))
//num+1>n说明这个数超过了范围,num % 10 == 9说明这个数位
//已经到9了两种情况都不能继续在这个数位找,所以要整除10来回到前面一个数位
num /= 10;
num++;
A[k++] = num ;
}
}
//输出字典序数组
for (int i = 0; i < n; ++i) cout << A[i] << endl;
return 0;
}