zhangjieyuyu 2023-06-18 09:11 采纳率: 100%
浏览 60
已结题

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

我在使用 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

  • 写回答

4条回答 默认 最新

  • 全栈若城 全栈领域优质创作者 2023-06-18 09:51
    关注

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

    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))
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 6月26日
  • 已采纳回答 6月18日
  • 赞助了问题酬金15元 6月18日
  • 创建了问题 6月18日

悬赏问题

  • ¥15 Llama如何调用shell或者Python
  • ¥20 谁能帮我挨个解读这个php语言编的代码什么意思?
  • ¥15 win10权限管理,限制普通用户使用删除功能
  • ¥15 minnio内存占用过大,内存没被回收(Windows环境)
  • ¥65 抖音咸鱼付款链接转码支付宝
  • ¥15 ubuntu22.04上安装ursim-3.15.8.106339遇到的问题
  • ¥15 blast算法(相关搜索:数据库)
  • ¥15 请问有人会紧聚焦相关的matlab知识嘛?
  • ¥15 网络通信安全解决方案
  • ¥50 yalmip+Gurobi