python圓周率測試

利用python測試圓周率是否包含所有6位數(shù)密碼赫编,及其首次出現(xiàn)的位數(shù)

先使用y-cruncher生成圓周率的前2500萬位,數(shù)據(jù)保存在txt文件中,文件大小24MB垒拢,修改文件只保留小數(shù)點后的數(shù)字,接下來就可以對數(shù)據(jù)進行測試火惊。

1求类,最直接的辦法查找

index()函數(shù)可返回開始的索引值,即首次出現(xiàn)的位數(shù)屹耐,代碼如下:

pi_file = r'E:\測試\Pi-25000000.txt'  # 讀取文件
with open(pi_file, 'r') as f:
    pi = f.read()
    #print(len(pi))

password_dict = {}  # 字典保存尸疆,密碼-首次出現(xiàn)位數(shù)
for num in range(1000000):  # 所有6位數(shù)字密碼
    key = ('%06d' % num)
    password_dict[key] = pi.index(key)
    if num % 100000 == 0:  # 查看進度
        print(key)

save_file = r'E:\測試\Pi-password.txt'  # 保存路徑
with open(save_file, 'w') as f:
    for key, value in password_dict.items():
        f.write('%s:%s\n' % (key, value))
測試結(jié)果:

000000-999999一共100萬種密碼都在圓周率前2500萬位中出現(xiàn),最后出現(xiàn)的密碼是569540惶岭,位數(shù)14118306(從0開始計數(shù))


密碼:首次出現(xiàn)的位數(shù)(從0開始計數(shù))

不過代碼運行比較慢寿弱,圓周率2500萬位查找100萬種密碼,共耗時1059秒俗他。

2脖捻,改進代碼分段查找

這是由于不斷使用index()函數(shù)對2500萬位數(shù)字從左向右查找,重復(fù)查找過多兆衅,因此可以從數(shù)字中查找密碼地沮,這樣每6位數(shù)字只需查找一次,改進代碼如下:

pi_file = r'E:\測試\Pi-25000000.txt'  # 讀取文件
with open(pi_file, 'r') as f:
    pi = f.read()

password_dict = {}  # 字典保存羡亩,密碼-首次出現(xiàn)位數(shù)摩疑,初始位數(shù)設(shè)為-1
for num in range(1000000):  # 所有6位數(shù)字密碼
    password_dict['%06d' % num] = -1


k = 100*10000  # 分段查找,每段設(shè)置位數(shù)
n_max = len(pi) // k  # 防止死循環(huán)畏铆,最好整除
n = 1
    
while -1 in password_dict.values() and n <= n_max:
    for i in range((n-1)*k, n*k):
        password = pi[i:i+6]
        if password_dict[password] == -1:
            password_dict[password] = i
        elif i < password_dict[password]:
            password_dict[password] = i
    n = n + 1

save_file = r'E:\測試\Pi-password.txt'  # 保存路徑
with open(save_file, 'w') as f:
    for key, value in password_dict.items():
        f.write('%s:%s\n' % (key, value))
測試結(jié)果是一樣的雷袋,不過運行速度大幅提高,改進代碼僅耗時8.5秒辞居,相差120倍楷怒。

3,測試是否包含日期

既然6位數(shù)密碼都在圓周率的前2500萬位中瓦灶,那么接下來測試一下1921年至2020年所有日期是否也在其中鸠删。

按照慣例,先用最直接的辦法查找贼陶,不過index()函數(shù)未找到會報錯刃泡,改為find()函數(shù)查找巧娱,代碼如下:

pi_file = r'E:\測試\Pi-25000000.txt'  # 讀取文件
with open(pi_file, 'r') as f:
    pi = f.read()

birthday_dict = {}  # 生日字典
mmdd = []
for m in range(1, 13):
    for d in range(1, 32):
        mmdd.append('%02d%02d' % (m, d))
temp = ['0229', '0230', '0231', '0431', '0631', '0931', '1131']
for i in temp:
    mmdd.remove(i)
# 直接查找
for year in range(1921, 2021):
    for md in mmdd:
        yyyymmdd = str(year) + md
        birthday_dict[yyyymmdd] = pi.find(yyyymmdd)
    if (year % 4) == 0:
        yyyymmdd = str(year) + '0229'
        birthday_dict[yyyymmdd] = pi.find(yyyymmdd)
    print(year)
   
save_file = r'E:\測試\Pi-birthday.txt'  # 保存路徑
with open(save_file, 'w') as f:
    for key, value in birthday_dict.items():
        f.write('%s:%s\n' % (key, value))
測試結(jié)果:

1921年至2020年一共36525天只有8020天在圓周率前2500萬位中出現(xiàn),最先出現(xiàn)的日期是20190914烘贴,位數(shù)243禁添,最后出現(xiàn)的日期是19660505,位數(shù)24999789(從0開始計數(shù))


日期:首次出現(xiàn)的位數(shù)(從0開始計數(shù))

直接查找自然很慢桨踪,耗時731秒老翘,按照之前的方法進行改進,改進代碼如下:

# 分段查找
for year in range(1921, 2021):
    for md in mmdd:
        birthday_dict[str(year) + md] = -1
    if (year % 4) == 0:
        birthday_dict[str(year) + '0229'] = -1

k = 100*10000
n_max = len(pi) // k  # 防止死循環(huán)馒闷,最好整除
n = 1

while -1 in birthday_dict.values() and n <= n_max:
    for i in range((n-1)*k, n*k):
        birthday = pi[i:i+8]
        if birthday in birthday_dict:  # 判斷是否為待查找日期
            if birthday_dict[birthday] == -1:
                birthday_dict[birthday] = i
            elif i < birthday_dict[birthday]:
                birthday_dict[birthday] = i
    n = n + 1
改進代碼僅耗時4.3秒酪捡,相差170倍。

既然2500萬位沒有測試出所有日期出現(xiàn)的位數(shù)纳账,那么再試試看1億位逛薇,結(jié)果一共36525天有23163天出現(xiàn)了,最后出現(xiàn)的日期是19640421疏虫,位數(shù)99995337(從0開始計數(shù))

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末永罚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子卧秘,更是在濱河造成了極大的恐慌呢袱,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翅敌,死亡現(xiàn)場離奇詭異羞福,居然都是意外死亡,警方通過查閱死者的電腦和手機蚯涮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門治专,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人遭顶,你說我怎么就攤上這事张峰。” “怎么了棒旗?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵喘批,是天一觀的道長。 經(jīng)常有香客問我铣揉,道長饶深,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任逛拱,我火速辦了婚禮粥喜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘橘券。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布旁舰。 她就那樣靜靜地躺著锋华,像睡著了一般。 火紅的嫁衣襯著肌膚如雪箭窜。 梳的紋絲不亂的頭發(fā)上毯焕,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機與錄音磺樱,去河邊找鬼纳猫。 笑死,一個胖子當著我的面吹牛竹捉,可吹牛的內(nèi)容都是我干的芜辕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼块差,長吁一口氣:“原來是場噩夢啊……” “哼侵续!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起憨闰,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤状蜗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鹉动,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體轧坎,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年泽示,在試婚紗的時候發(fā)現(xiàn)自己被綠了缸血。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡边琉,死狀恐怖属百,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情变姨,我是刑警寧澤族扰,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站定欧,受9級特大地震影響渔呵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜砍鸠,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一扩氢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧爷辱,春花似錦录豺、人聲如沸朦肘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽媒抠。三九已至,卻和暖如春咏花,著一層夾襖步出監(jiān)牢的瞬間趴生,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工昏翰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留苍匆,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親乏奥。 傳聞我的和親對象是個殘疾皇子鸯隅,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355