计算数自然数序列中的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))  


你可能感兴趣的:(算法,python)