1的数目(python)

给定一个十进制正整数N,写下从1开始到N的所有整数,然后计算其中出现1的个数。

例如:

N = 2,1到N的所有整数为1,2。这里出现一个’1‘.

N = 12,有1到N的所有整数为1,2,3,4,5,6,7,8,9,10,11,12。这里出现 ’1‘,‘10’,’11‘,’12‘一共5个1。

解法 1

暴力解法:直接遍历1到N中的数。

def Count1InInteger(num):
    count = 0
    while num:
        count += 1 if num%10 == 1 else 0
        num //= 10
    return count

N = int(input())
icount = 0
for i in range(1,N+1):
    icount += Count1InInteger(i)
print(icount)

解法 2

使用规律来进行求解,就拿12013的百位来进行讲解:

如果百位为0,则百位出现1的个数等于(12)更高位数\times当前位数(100)。

如果百位为1,则百位出现1的个数等于(12)更高位数\times当前位数(100)+ 更低位数 (13)+ 1

如果百位大于1,则百位出现1的个数等于(13)(更高位数+1)\times当前位数(100)。

n = int(input())
iCount, iFactor = 0, 1
iLowerNum, iurrNum, iHightNum = 0, 0, 0
while n/iFactor:
    iLowerNum = n - (n//iFactor)*iFactor
    iCurrNum = (n//iFactor)%10
    iHightNum = n//(iFactor*10)
    if iCurrNum == 0:
        iCount += iHightNum*iFactor
    elif iCurrNum == 1:
        iCount += iHightNum*iFactor + iLowerNum + 1
    else:
        iCount += (iHightNum +1)*iFactor
    iFactor *= 10
print(iCount)

扩展

对于二进制

f(1) = 1

f(10) = 10 (因为01,10有两个1)

f(11) = 100 (因为01,10,11有四个1)

自己推测的规律还没有验算只是手动推了一下:

        当前位为0时,出现1的个数等于高位乘当前位数

        当前位为0时,出现1的个数等于高位乘当前位数+低位+1

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值