递增数的一种思路

蓝桥杯线上模拟赛—递增数

题目

若一个正整数A,相邻位总是满足低位大于等于高位,则称之为递增数。 例如:1223,667 等都是递增数。
现在有个正整数X,请问有多少个正整数A满足1<=A<=X,且A为递增数。

Input 输入数据一个正整数X(1<=X<=100000000)
Output 对于每个数据,输出一个答案,参见输出样例。

其他方法

赛时感觉题目蛮有意思的,准备赛后写个博客留念,赛后资料的时候找到了一个全排+回溯的算法,意识到或许我的方法不太一样,后面我来说一下我的思路。

思路

首先可以确定暴力一定会超时,然后考虑分段来看。
我考虑的是分 位数和这个位数上的数来看。比如个位上对应1-9,都只有一个递增数(这毫无疑问只有它本身);10—99之间,十位是1的递增数有9个,是2的递增数有8个……是9的递增数有一个;100-999之间百位是一的递增数有……
其中第一列是这个位数所有递增数之和,后面对应这一位为1-9的递增数数目。

    9        1        1        1        1        1        1        1        1        1
   45        9        8        7        6        5        4        3        2        1
  165       45       36       28       21       15       10        6        3        1
  495      165      120       84       56       35       20       10        4        1
 1287      495      330      210      126       70       35       15        5        1
 3003     1287      792      462      252      126       56       21        6        1
 6435     3003     1716      924      462      210       84       28        7        1
12870     6435     3432     1716      792      330      120       36        8        1
24310    12870     6435     3003     1287      495      165       45        9        1
43758    24310    11440     5005     2002      715      220       55       10        1

代码如下:

    int a[10][10] = {
    0 };
    for (int i = 1; i < 10; i++)
        a[0][i] = 1;
    for (int i = 1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值