计算数自然数序列中的1和2

问题:

    给定一个自然数N,计算1,2,3...N中,出现1和2的数量。比如1,2,3...10,一共出现了3次,1,2,3...12,一共出现了7次。

 

思路:

    比如计算54321,可以先计算50000,再计算50001-54321中1和2的个数,而后者又可以看成计算4321中1和2的个数,于是简化了问题。其中计算50000的时候,可以计算49999中有多少个1和2,也就递归转变成了一个已知的求解方法,再加上50000所代表的1和2的个数(0个)。


def count_from_number(number):  
    if number < 10:  
        if number == 0:  
            return 0  
        elif number == 1:  
            return 1  
        else:  
            return 2  
    number_str = str(number)  
    first = number_str[0]  
    left = number_str[1:]  
    head = first + len(left) * '0'  
    count = 0  
    count += count_head(int(head))  
    if first == '1' or first == '2':  
        count += (number - int(head))  
    count += count_from_number(int(left))  
    return count  
  
// 这个方法计算1000、50000这种以0结尾的数字中1和2的个数  
def count_head(number):  
    number_str = str(number)  
    first = number_str[0]  
    count = 0  
    if first == '1' or first == '2':  
        count += 1  
    count += count_from_number(number - 1)  
    return count  
  
number = 10  
print("count 1 or 2 for %d"%number)  
print("result: %d"%count_from_number(number))  
number = 12  
print("count 1 or 2 for %d"%number)  
print("result: %d"%count_from_number(number))  
number = 122  
print("count 1 or 2 for %d"%number)  
print("result: %d"%count_from_number(number))  


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值