目录
1.问题描述
一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。数字计数问题要求对给定书的总页码n(<=200000),计算出书的全部页码中分别用到多少次数字0,1,2,…,9。
2.算法
1) 利用求余求商函数divmod(a,b)获得除10的余数和商,并将数字累加到数组中。
div,mod = divmod(i,10)
2)同样可以使用数学公式来求得余数和商:
#div = i/10
#mod = i%10#功能上同,都是求余求商
3.注意事项
1)考虑到当i<10时,求得div均为0,如果此时累加的话,0的累加数量就会出错,所以要进行单独考虑。
2)通过numpy函数库,调用numpy.zeros()函数,创建一个全0数组,用来存放各数字的累计数量。
3)考虑到文件输入的需求,留有文件输入的接口:
df = pd.read_excel(‘booknumber.xlsx’)
N = df.loc[0]
4)通过range(a,b)函数创建一个有序数列,值得注意的是该函数不包括右端点数值,故需要对传入的数据N进行n=N+1处理。
5)由于用10求商div,所以会出现div>10的情况,在这种情况下需要单独处理。对div多次使用divmod(a,b)函数,直到div<10为止。
#引入所需模块
import numpy as np
#留有通过文件传入数据的功能接口
# df = pd.read_excel('booknumber.xlsx')
# N = df.loc[0]
#定义一个函数,传入N作为数据
def Book_Number(N):
#定义一个值全为0的,具有10个元素的一维数组,用来存放统计出来的各数字的数量
arr = np.zeros(10, dtype=int)
#由于页码从1开始,在0到9之间,各数字各有一个,故将arr[i]设置为0
#在计算之前打印数组,查看数组元素
print( arr)
#由于包含右端点,故N+1
n = N + 1
#页码从1开始进行计算
for i in range(1, n):
#调用求商和求余函数
#div = i/10
#mod = i%10#功能下同,都是求余求商
div,mod = divmod(i,10)
#当i<10时,商div均为0,不能累加到0的数组中
if i<10:
arr[mod] += 1
#任何数用10求余数,余数必然小于10
#对应的余数作为数组下标,自动累加
else:
arr[mod] += 1
#由于用10求商,商有可能大于10,故需要对大于10的商再进行求商求余数,直到商小于10
while div>=10:
div,mod = divmod(div,10)
arr[mod] += 1
#将最后一个小于10的商累加到对应的数组元素中
arr[div] += 1
#打印查看累加完的数组数据
print(arr)
#对数据进行组织,格式化输出为人能看懂的形式
print("当N为{}时,0共有{}个,1共有{}个,2共有{}个,3共有{}个,4共有{}个,\
5共有{}个,6共有{}个,7共有{}个,8共有{}个,9共有{}个".format(N,arr[0],arr[1],arr[2],arr[3],arr[4],arr[5],arr[6],arr[7],arr[8],arr[9],))
Book_Number(20)
版权声明:本文为GUIDchen原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。