查找、数学--十进制中1的个数

题目:求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。如1~13中含有1的个数为6个

思路:
1、按个、十、百、千…分别判断每一位中 1 的个数,然后相加。

2、对某一位含1个数的判断:
如对百位(i=100)包含1的个数:
a、当百位为0时,含1的个数为 更高位 的数字 *100,
1-13045,其中百位为1的数字个数为 13**100=1300个

b、当百位为1时,含1的个数,需要比a再增加个零头数:
1-13145,其中百位为1的数字个数为 13**100+(45+1)=1346个

c、当百位为2-9时,含1的个数,需要比a再增加整个数:
1-13245,其中百位为1的数字个数为 13**100+1*100 =1400个

class Solution:
    def NumberOf1Between1AndN_Solution(self, n):
        # write code here
        #如何把每一位的数分开?/10
        i=1
        count=0
        while i<=n:
            a=n/i
            b=n%i
            count+=a/10*i #比第i位高的数,在第i位产生的1的个数
            if a%10==1:
                count+=b+1 #第i位为1,会增加零头数
            elif a%10 >=2: #第i位大于1,会增加i个整数
                count+=i
            #count+=(a+8)/10*i+(a%10==1)*(b+1)
            i*=10
        return count
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值