统计0到n各数字的个数

  • Post author:
  • Post category:其他



目录


1.问题描述


2.算法


3.注意事项



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 版权协议,转载请附上原文出处链接和本声明。