在圆周率小数位中寻找特定数组为何迟迟无法输出结果

我在使用 python 在圆周率的小数位中寻找手机尾号四位时,发现得到一百位小数部分以后的程序出现了问题

sj=list(input("请输入手机号后四位:"))
B=100
y=0
x=0
while x==0:
    n = int(B) #输入字符转换为整数
    t = n+10                                     #多计算10位,防止尾数取舍的影响
    b = 10**t                                    #为算到小数点后t位,两边乘以10^t
    x1 = b*4//5                                  #取整求含4/5的首项
    x2 = b // -239                               #取整求含1/239的首项
    s = x1+x2                                    #求第一大项
    n *= 2                                       #设置下面循环的终点,即共计算n项
    for i in range(3, n, 2):                     #循环初值=3,末值n,步长=2
        x1 //= -25                               #取整求每个含1/5的项及符号
        x2 //= -57121                            #取整求每个含1/239的项及符号
        x = (x1+x2) // i                         #求两项之和,除以对应因子,取整
        s += x                                   #求总和
    pai = s*4                                    #求出π
    pai //= 10**10                               #舍掉后十位
    pai_decimal=int(pai%(10**100))#π的最远100位小数部分
    print(pai_decimal)
    
    pi_leave=[]
    t=0
    while t==0:
        for v in range(0,len(pi_leave)):
            pi=[list(str(pai_decimal))].insert(v,pi_leave[v])
            pi1=pi[:-3]
            u=0
            while u==0:
                for i,m in enumerate(pi1):
                    if m==sj[0]:
                        if pi[i+1]==sj[1]:
                            if pi[i+2]==sj[2]:
                                if pi[i+3]==sj[3]:
                                    y=1
                                    u=1
                                    t=1
                                    print(i+1)
            else:
                pi_leave=pi[-3:]
    if y==1:
        x=1
        print(i+1)
    else:
        x=0
        B=B+100

即使是输入1415,即小数位第一组四位数字,程序也会运行十几分钟仍无结果,还不报错。如图所示。

img

你看下,如有帮助,给个采纳,下个问题不迷路呦 :

img


分享如下 :
我发现代码中的第一个while循环在每个迭代中都重新计算了圆周率的前100位小数部分,非常低效。实际上,只需要在第一个while循环外面计算出圆周率的前100位小数部分,然后在后面的每个迭代中使用这个值即可。
而且代码中的第二个while循环也不必要。你可以尝试使用python内置函数find()来查找字符串,它可以大幅简化代码并提高效率。
修改后代码如下 :



sj = list(input("请输入手机号后四位:"))

# 计算圆周率的前100位小数部分
B = 110
n = int(B)
t = n + 10
b = 10 ** t
x1 = b * 4 // 5
x2 = b // -239
s = x1 + x2
n *= 2
for i in range(3, n, 2):
    x1 //= -25
    x2 //= -57121
    x = (x1 + x2) // i
    s += x
pai = s * 4
pai //= 10 ** 10
pai_decimal = pai % (10 ** 100)

pi_str = str(pai_decimal)
n_digits = len(pi_str)

# 在圆周率小数部分中寻找手机号后四位
idx = pi_str.find(''.join(sj))
while idx == -1:
    # 若未找到,则继续计算下100位圆周率的小数部分
    B += 100
    n = int(B)
    t = n + 10
    b = 10 ** t
    x1 = b * 4 // 5
    x2 = b // -239
    s = x1 + x2
    n *= 2
    for i in range(3, n, 2):
        x1 //= -25
        x2 //= -57121
        x = (x1 + x2) // i
        s += x
    pai = s * 4
    pai //= 10 ** 10
    pai_decimal = pai % (10 ** 100)
    pi_str += str(pai_decimal)

    # 再次在新的100位小数部分中寻找手机号后四位
    idx = pi_str.find(''.join(sj), -100)

print("在圆周率小数部分中找到了手机号,位置为第{}位。".format(idx+1))
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632

python太慢了。你可以这样,去下载一个 super pi 软件,用它可以算圆周率,而且比较快(quick pi、fast pi等也可以)
然后用你的python读取其生成的结果文件(后缀是一个dat,其实是文本文件)
然后查找你的电话后四位