1~n整数中1出现的次数(基于每一位出现次数求和解法)

算法题目: 输入一个整数n, 求1 ~ n 这n 个整数的十进制表示中1 出现的次数。

例如,输入12, 1~12 这些整数中包含1的数字有1 、10 、11 和12, 1 一共出现了5 次。

直观解法:

直观解法,遍历从1到n,分别对每个数字含有的1个数求和
在这里插入图片描述 在这里插入图片描述

分析数字解法

分析数字,分别计算每一位1出现的次数
分析规律:首先对某一位的几个变量
权值 p:个位权值为1,十位权值为10,百位权值为100…
高位数 h:由比该位高位的数字组成的数
低位数 l:由比该位低位的数字组成的数
index:从低位开始的索引,从0开始
例如: 数字21045
index=2,表示百位数字0,权值位 p=100,高位数为 h=21,低位数为 l=34
1在某一位出现的次数:分三种情况考虑
(1)当该位数值为0时,1在该位出现次数为 h*p 解释:对如上数字百位为0,该位1出现时高位可选0~20,低位可选0~99,排列组合故出现21*100次
(2)当该位数值为1时,1在该位出现次数为 h*p+l+1 解释:对如上数字千位为1,将其分为1~20999和21000到21045,前一部分按为0时处理出现2*1000次,后一部分1在该位出现45+1次。
注意:个位的低位数为0。
(3)当该位数值大于1时,1在该位出现次数为(h+1)*p 解释:对如上数字 十位为4,该位1出现时高位可选0~210,低位可选0~9,排列组合故出现(210+1)*10次
图解:
在这里插入图片描述
代码:
在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值