c语言圆周率acm,圆周率里有每个人的银行卡密码和生日?混知乎的程序员果然都是神一般的存在...

原标题:圆周率里有每个人的银行卡密码和生日?混知乎的程序员果然都是神一般的存在

有人好奇,既然圆周率是无限不循环小数,会不会包括这个世界上的任何信息,包含了这个世界?

能否包含“任何信息”不好说,但一个冷知识是,圆周率里有每个人的银行卡密码!不信?看看这位来自知乎的程序员朋友是怎么证明的。

以下内容来自知乎用户vortex的回答:

这个问题挺有意思,非数学专业,就从计算机的角度分析一下这个问题吧。

---我是条分割线----

为了分析这个问题,我先用y-cruncher跑出了π的前10亿位,感觉应该够用!

不够用也没办法了,内存有限,而且跑程序时CPU占用率100%,风扇吹的我心慌。

c53ebd70c0cd89b9f5d7a7145a3cd53f.png

让人无奈的占用率

计算前10亿位共用时190.515秒,数据以txt的格式保存,大小976.563MB。

下面开始我们的分析工作。

先简单的搜索一下,发现自己能想到的几个六位数字都出现了(包括我的银行卡密码)

举几个例子:

4e24de661ffaaedaa764c68b815c0982.png

000000出现在小数点后第1,699,927位

aa5ca1c44b219b80a9aee04bdfb9a110.png

111111出现在小数点后第255,945位

4dada69f077e06d36566166291d4f724.png

222222出现在小数点后第963,024位

386de9a499f3b8e3efa23aba81ce1628.png

123456出现在小数点后第2,458,885位

注:每行有1024个字符,所以计算公式应为1024*(行数-1)+列数-2,其中2为开头的“3.”

但是不可能手动把000000~999999全验证一遍吧(虽然我今天很闲),还是要写个程序跑一下。

不考虑复杂度问题的话,代码很快就写完了,只有短短的14行。

593d4b70382902d96700e9d553181845.png

因为我用的是index,如果密码不存在的话,则会直接抛出异常。但是我的直觉是000000~999999是都存在的(其实是我懒得多写代码了)

检索的速度大概是1000条/秒,接下来就是耐心的等待过程。

程序跑完了!不出所料,所有的六位银行卡密码在π中都是存在的。

最后出现的密码是569540,位于小数点后14,118,307位.(10亿位有点过剩啊!)

95bfa2b141c0379dab52a48030b6b041.png

统计数据截图

留个彩蛋~

虽然π是无限不循环的,但是对我来说只截止到小数点后7,599,477位。

---又是条分割线----

我又写了个程序把π前10亿位中的生日给跑了出来,生日的范围为1920~2020共计101年。

上代码~供有兴趣的朋友研究,可以一起讨论如何计算的更快。(感觉这个完全可以出一个面试题的!我水平是不太行,下面是我想到的方法。)

a0a9f22339936208c50267e2dc597528.png

4fe5652c2181ee1657e029decbc87bd7.png

---还是条分割线----

下面的内容非程序员可忽略...

经评论区的朋友们启发,而且实在受不了别人喷我程序运行的慢了。又写了一个更快的检索6位数字(就是所谓的银行卡密码)的算法。

感兴趣的程序员可以看一下。我感觉速度还行。十几秒钟就能检索完毕。更快的我暂时也还没想到..毕竟答主还只是一个大二在校生,也没搞过ACM竞赛,水平有限。

c7646a610770729591462e9c2bca9ab0.png

6622bf4e4d21b2674218c6e52853e988.png

---打开彩蛋的分割线----

上面的彩蛋要打开了。

3b35aa8b0f006dd91301f5430fc4e413.png

小数点后第7,599,469位至第7,599,477位

小数点后7,599,469位至7,599,477位是19980304,也就是1998年3月4号,一个女孩的生日咯~

本文来源:

https://www.zhihu.com/question/23419402/answer/327661779

来源:数据与算法

责任编辑:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值