用Python求出:1到某个数的奇数序列里一共出现了多少个3
生活随笔
收集整理的這篇文章主要介紹了
用Python求出:1到某个数的奇数序列里一共出现了多少个3
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
從1開始到微信ID的數字中(),奇數序列里一共出現了多少個3。
這次練習附加題。
方法一:
import time start = time.clock() inum = 866278171 sum = 0def fsum(n, sum):n = str(n)for i in range(len(n)):if n[i] == '3':sum += 1return sumfor i in range(3, inum+1):if i % 2 == 0:continueif str(i).find('3') > -1 :sum = fsum(i, sum) print('1 ~ {} 之間的奇數序列,總共有 {} 個 3 。'.format(inum, sum))end = time.clock() print('耗時:{}'.format(end - start))不過這個運行很耗時,不知道有沒有更好的方法,或加速程序執行速度的方法。
因為方法一實在太慢了,雖然算小數沒有問題,但題目中的數太大了——我電腦都休眠了,還沒算出結果。
不得已,想其他辦法,有了方法二。做這個方法時幾次把自己繞到坑里,快懷疑自己數死早了……
方法二:
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' import time start = time.clock() inum = 866278171 sumA = 0def f1(l, sum = 1):if l == 1:return sumsum = f1(l-1) * 10 + 10 ** (l-2) * 5return suminumStr = str(inum) while len(inumStr) > 1:l = len(inumStr) - 1if int(inumStr[0]) < 3:sumA += f1(l) * int(inumStr[0])elif int(inumStr[0]) > 3:sumA += f1(l) * int(inumStr[0]) + 10 ** (l-1) * 5else :sumA += f1(l) * int(inumStr[0]) + int((int(inumStr[1:]) + 1) / 2)inumStr = inumStr[1:]if int(inumStr) > 2:sumA += 1print('1 ~ {} 之間的奇數序列,總共有 {} 個 3 。'.format(inum, sumA))end = time.clock() print('耗時:{}'.format(end - start))方法二和方法一比,性能是杠杠的,但邏輯上就要繞下彎才能理解了。
結果的話,挑了一部分數據,通過和方法一的結果做比較,來確認準確性。
當然因為這次是手動做的測試,所以只做來小范圍的確認。
下次要對這2個方法再做改造,然后利用python的單元測試,通過生成隨機數,再做更廣泛的確認。
關于方法二的解體思路,也在下次確認通過后,再做詳細解釋吧。
總結
以上是生活随笔為你收集整理的用Python求出:1到某个数的奇数序列里一共出现了多少个3的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 鸭子类型及三大特性
- 下一篇: 在python中如何比较两个float类