统计0到n各数字的个数

目录

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)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值