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的单元测试,通过生成随机数,再做更广泛的确认。

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

  • 相关阅读:
    Java对象的生命周期与作用域的讨论(转)
    [置顶] Oracle学习路线与方法
    Java实现 蓝桥杯 算法训练 未名湖边的烦恼
    Java实现 蓝桥杯 算法训练 未名湖边的烦恼
    Java实现 蓝桥杯 算法训练 未名湖边的烦恼
    Java实现 蓝桥杯 算法训练 最大的算式
    Java实现 蓝桥杯 算法训练 最大的算式
    Java实现 蓝桥杯 算法训练 最大的算式
    Java实现 蓝桥杯 算法训练 最大的算式
    Java实现 蓝桥杯 算法训练 最大的算式
  • 原文地址:https://www.cnblogs.com/yjys/p/10726705.html
Copyright © 2011-2022 走看看