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