zoukankan      html  css  js  c++  java
  • 1到某个数的奇数序列里一共出现了多少个3

    还是上次那个素数妹子的题(已知素数的积,求这2个素数)。

    妹子还提了附加题:从1开始到微信ID的数字中(),奇数序列里一共出现了多少个3。

    这次练习附加题。

    方法一:

    import time
    start = time.clock()
    inum = 866278171
    sum = 0
    
    
    def fsum(n, sum):
        n = str(n)
        for i in range(len(n)):
            if n[i] == '3':
                sum += 1
        return sum
    
    
    for i in range(3, inum+1):
        if i % 2 == 0:
            continue
        if str(i).find('3') > -1 :
            sum = fsum(i, sum)
    print('1 ~ {} 之间的奇数序列,总共有 {} 个 3 。'.format(inum, sum))
    
    end = time.clock()
    print('耗时:{}'.format(end - start))

    不过这个运行很耗时,不知道有没有更好的方法,或加速程序执行速度的方法。

    因为方法一实在太慢了,虽然算小数没有问题,但题目中的数太大了——我电脑都休眠了,还没算出结果。

    不得已,想其他办法,有了方法二。做这个方法时几次把自己绕到坑里,快怀疑自己数死早了……

    方法二:

    import time
    start = time.clock()
    inum = 866278171
    sumA = 0
    
    
    def f1(l, sum = 1):
        if l == 1:
            return sum
        sum = f1(l-1) * 10 + 10 ** (l-2) * 5
        return sum
    
    
    inumStr = str(inum)
    while len(inumStr) > 1:
        l = len(inumStr) - 1
        if int(inumStr[0]) < 3:
            sumA += f1(l) * int(inumStr[0])
        elif int(inumStr[0]) > 3:
            sumA += f1(l) * int(inumStr[0]) + 10 ** (l-1) * 5
        else :
            sumA += f1(l) * int(inumStr[0]) + int((int(inumStr[1:]) + 1) / 2)
        inumStr = inumStr[1:]
    
    if int(inumStr) > 2:
        sumA += 1
    
    print('1 ~ {} 之间的奇数序列,总共有 {} 个 3 。'.format(inum, sumA))
    
    end = time.clock()
    print('耗时:{}'.format(end - start))

    方法二和方法一比,性能是杠杠的,但逻辑上就要绕下弯才能理解了。

    结果的话,挑了一部分数据,通过和方法一的结果做比较,来确认准确性。

    当然因为这次是手动做的测试,所以只做来小范围的确认。

    下次要对这2个方法再做改造,然后利用python的单元测试,通过生成随机数,再做更广泛的确认。

    关于方法二的解体思路,也在下次确认通过后,再做详细解释吧。

  • 相关阅读:
    微分方程、动力系统与混沌导论 第1章 一阶方程[书摘]
    微分方程解耦
    指数输入时微分方程特解的求法
    例说信号与系统
    SVD分解的理解[转载]
    3D数学 ---- 矩阵和线性变换[转载]
    千里积于跬步——流,向量场,和微分方程[转载]
    微分方程——包络和奇解
    微分方程——基本概念和常微分方程的发展史
    sencha touch 入门学习资料大全
  • 原文地址:https://www.cnblogs.com/yjys/p/10726705.html
Copyright © 2011-2022 走看看