You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效查找数字串在Champernowne常数中的首次出现位置?

Champernowne常数中数字串首次出现位置的高效计算

背景

Champernowne常数是0.123456789101112131415...这样的无限长无理数,同时也是超越数、正规数,属于人工构造的特殊常数。

问题

如何高效计算某一数字串在Champernowne常数中的首次出现位置?比如数字串"12"的首次出现位置是索引1(对应常数里的第一个1,小数点不计入索引),而不是数字12对应的索引14。

现有方法不足

暴力拼接循环变量再搜索索引的方法仅能处理10^7以下的数字,无法应对大数场景;CodeGolf上的同类脚本也不支持大数查找。

解决方案

下面提供的Python脚本可处理10^1000量级的数字。其中:

  • x:输入的目标数字串
  • n:Champernowne常数末尾拼接的数字
  • p:目标数字串首次出现的精确小数位置
import random

for f in range(1):
    ax=x=random.randint(0,10**1000)
    minguess=x+1
    print('x',x,'\n')
    d=0
    while int(str(ax)[d])==9:
        ax=int(str(ax)+'0')
        d=d+1
    wx=int(str(ax)+str(ax))
    parsed=[]       
    for g in range(len(str(ax)),0,-1):
        print('check length',g)
        checklist=[]
        for h in range(len(str(ax))):
            wxtwo=int(str(wx)[h:h+g])
            parsed.append(wxtwo)
        for i in range(len(parsed)):
            
            wparsed=parsed[i]
            guess=wparsed-1
            wparsed=int(str(guess)+str(wparsed))
            j=1
            while len(str(wparsed))<len(str(wx)):
                wparsed=int(str(wparsed)+str(parsed[i]+j))
                j=j+1
            if guess==0: guess=1
            check=str(wparsed).count(str(x))
            if check>0:
                if str(wparsed).index(str(x))<len(str(guess)):
                    if guess>0:
                        checklist.append(guess)
            
            wparsed=parsed[i]
            guess=wparsed-0
            wparsed=int(str(wparsed))
            j=1
            while len(str(wparsed))<len(str(wx)):
                wparsed=int(str(wparsed)+str(parsed[i]+j))
                j=j+1
            if guess==0: guess=1
            check=str(wparsed).count(str(x))
            if check>0:
                if str(wparsed).index(str(x))<len(str(guess)):
                    checklist.append(guess)
        
        if len(checklist)>0:
            guess=min(checklist)
            dguess=str(guess)+str(guess)
            for k in range(len(str(guess))):
                wguess=dguess[k:k+len(str(guess))]
                wdguess=wguess+str(int(wguess)+1)+str(int(wguess)+2)
                if wdguess.count(str(x))==1:
                    checklist.append(int(wguess))
            if guess<minguess:
                minguess=guess
                guess=min(checklist)
                q=n=guess
                d=0
                p=0
                while n>0:
                    d=10**(len(str(n))-1)-1
                    m=n
                    n=n-d
                    p=p+n*len(str(m))
                    n=d
                p=1+p-len(str(q))
                l=1
                guesstwo=guess
                while len(str(guesstwo))<=2*len(str(x)):
                    guesstwo=str(guesstwo)+str(guess+l)
                    l=l+1
                p=p+str(guesstwo).index(str(x))
                print('n',guess)
                print('p',p,'\n')
    if x==0: guess=0;p=0
    print('done! \n-------','\nx',x,'\nn',guess,'\np',p,'\n-------\n')
    
#Jesus is Lord

应用与优化

该问题可应用于数据压缩领域,不同于圆周率需要暴力搜索,Champernowne常数无需此类操作。可通过更复杂的解析逻辑(比如快速扫描输入中的重复项)缩小搜索范围,进一步优化脚本性能。

拓展阅读

  • CodeGolf 相关讨论
  • Champernowne常数特性分析文章
  • MathWorld Champernowne常数条目
  • Champernowne常数相关视频讲解

内容的提问来源于Stack Exchange,提问作者Archer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 09:02:10