尤拉計劃751:串聯重合

lt發表於2021-03-14

一個實數c通過以下過程,可以從任何正實值生成非遞減整數序列:

b[1]=c b[n]=floor(b[n-1])*(floor(b[n-1])-b[n] + 1),對n>=2

a[n]=floor(b[n])

例如,c=2.956938891377988...生成斐波那契序列:2, 3, 5, 8, 13, 21, 34, 55, 89, ...

正整數序列的串聯是一個實值,表示為將序列a中的元素,第一個放在小數點之前,從第二個位置開始其餘的串聯在小數點之後:

例如,根據c構造的斐波那契序列可以產生串聯值為2.3581321345589...。顯然,對於這個c值,c!=t。

求生成的序列開始於的唯一值c,並且生成的序列的串聯t等於原始值c。把你的答案四捨五入到小數點後24位。

用浮點數判斷, 精度達不到要求.

def find():
 d=1
 low=2
 high=3
 while low<high:
  mid=(high+low)/2
  d=t(mid)-mid
  print(mid,d);
  if d<0:
   high=mid
  else:
   low=mid
  if abs(d)<1e-25:break


def t(r):
 b=[r]
 a=[int(b[0])]
 for i in range(0,16):
  bi=a[i]*(b[i]-a[i]+1)
  ai=int(bi)
  b.append(bi)
  a.append(ai)
 return float('0.'+''.join([str(i) for i in a]))*10

>>>> find()
2.5 -0.16666666666666652
2.25 -0.016666666666666607
...
2.2235610193135544 -4.440892098500626e-16
2.223561019313554 0.0
>>>> t(2.223561019313554)
2.223561019313554

相關文章