鱼C论坛

 找回密码
 立即注册
查看: 4701|回复: 11

题目64:10000以下的连分数中有多少拥有奇数周期?

[复制链接]
发表于 2016-10-14 17:30:41 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2016-10-14 21:22 编辑

这题的思路就是找出除整数部分后面的无理数从第几位开始循环。
a是整数部分+无理数部分,d是整数部分,c就是无理数部分。
依次存入列表,然后比较。开始循环了就记录下来。
代码如下:

  1. import math
  2. def gao(n):
  3.         m = int(math.sqrt(n))
  4.         if m * m == n:
  5.                 return 0
  6.         dic = {}
  7.         d = m
  8.         a = n
  9.         b = -m
  10.         c = 1
  11.         len = 0
  12.         while True:
  13.                 nc =  a - b * b
  14.                 nc /= c
  15.                 nd = int((math.sqrt(a) - b) / nc)
  16.                 nb = -b - nd * nc
  17.                 t = (nb, nc, nd)
  18.                 b = nb
  19.                 c = nc
  20.                 d = nd
  21.                 if not t in dic:
  22.                         len += 1
  23.                         dic[t] = 1
  24.                 else:
  25.                         break
  26.                        
  27.         return len
  28. ans = 0
  29. for i in range(1, 10001):
  30.         k = gao(i)
  31.         if k % 2 != 0:
  32.                 ans += 1
  33. print (ans)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-14 20:41:06 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2016-10-14 21:22 编辑

结果1322
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-16 21:56:30 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2016-10-16 22:17 编辑

另外一个暴力的的方法,用decimal库,把精度提高到250位以上(200位小数,仍有3个数有误差)
同样可以得到结果......1322......7秒多,速度也还行,简单粗暴,不用考虑复杂的数学方程式
  1. import decimal as dc
  2. dc.getcontext().prec = 250
  3. def root(n):
  4.     blist = []
  5.     n0 = dc.Decimal(i).sqrt()
  6.     a0 = int(n0)
  7.     b0 = n0 - a0
  8.     n1 = 1/b0
  9.     a1 = int(n1)
  10.     b1 = n1 - a1
  11.     while str(b1)[:11] not in blist:
  12.         blist.append(str(b1)[:11])
  13.         n1 = 1/b1
  14.         a1 = int(n1)
  15.         b1 = n1 - a1
  16.     return len(blist)

  17. count = 0
  18. for i in range(2,10000):
  19.     if i**0.5 != int(i**0.5):
  20.         if root(i) % 2 == 1:
  21.             count += 1
  22. print (count)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-9-26 03:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表