鱼C论坛

 找回密码
 立即注册
查看: 3834|回复: 5

[技术交流] [趣题分享] 的士数

[复制链接]
发表于 2018-2-22 16:25:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 jerryxjr1220 于 2018-2-22 17:35 编辑

看到有篇文章介绍了一个数学天才--拉马努金,有一次他和大数学家哈代乘坐一辆出租车,他俩谈到出租车的号码时,哈代说:“号码1729,对我来说相当单调,但愿它不是一个不幸的兆头”。

拉马努金立刻回答:“不,那是个有趣得很的数。可以用两个立方之和来表达而且有两种表达方式的数之中,1729是最小的。”

因为1729 = 1**3+12**3 = 9**3 + 10**3。

这样的数后来被称作“的士数”,而1729是其中最小的。

那么第2小的“的士数”是多少?

请用python来求解。

附加题:

如果一个数可以写作两个数的立方和,并且有3种表达方式,我们称做“超级的士数”。

那么最小的超级的士数是多少? 10亿以下有多少“超级的士数”?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-2-22 16:59:11 | 显示全部楼层
没有太好的想法,用个笨办法:
  1. cube = [i ** 3 for i in range(22)] #这里是个“Bug”,先考虑立方数不大于10000
  2. list1 = []
  3. list2 = []
  4. for i in range(1, 22):
  5.     for j in range(i, 22):
  6.         s = cube[i] + cube[j]
  7.         list1.append(s)
  8. for i in list1:
  9.     if list1.count(i) == 2 and not i in list2:
  10.         list2.append(i)
  11. print(list2[1])
复制代码

4104
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-22 17:15:03 | 显示全部楼层
本帖最后由 shigure_takimi 于 2018-2-22 17:20 编辑
  1. def isTexiNumber(n):
  2.     a = int(n ** (1/3) + 0.5)
  3.     count = 0
  4.     for i in range(1, a):
  5.         for j in range(i, a+1):
  6.             if i**3+j**3 == n:
  7.                 count += 1
  8.                 if count == 2:
  9.                     return True
  10.     else:
  11.         return False

  12. n = 1730
  13. while True:
  14.     if isTexiNumber(n):
  15.         print('第二小的的士数:', n)
  16.         a = int(n ** (1/3) + 0.5)
  17.         for i in range(1, a):
  18.             for j in range(i, a+1):
  19.                 if i**3+j**3 == n:
  20.                     print('{}**3 + {}**3 = {}'.format(i,j,n))
  21.         break
  22.     else:
  23.         n += 1


  24. ##    第二小的的士数: 4104
  25. ##    2**3 + 16**3 = 4104
  26. ##    9**3 + 15**3 = 4104
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-26 21:15:34 | 显示全部楼层
  1. 粗糙的写了个
  2. def di():
  3.     for i in range(100):
  4.         for j in range(i+3,103):
  5.             t = (i**3) + (j**3)
  6.             yield (i,j,t)

  7. def shi():
  8.     for m,n,q in di():
  9.         i,j,t = m,n,q
  10.         for k in range(i+1,j-1):
  11.             for l in range(k+1,j):
  12.                 if (k**3) + (l**3) == t:
  13.                     print(t)

  14. shi()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-27 09:50:12 | 显示全部楼层
这个超级的士数不知道对不对,借鉴了你之前在约瑟夫环的方法
  1. import math

  2. t = [i**3 for i in range(0,1000)]
  3. t1 = int(math.sqrt(50000000))+1

  4. def di():
  5.     for i in range(1,t1):
  6.         for j in range(i+1,1000):
  7.             f = t[i] + t[j]
  8.             if f>=1000000000:
  9.                 break
  10.             yield (f)

  11. def s():
  12.     m1 = []
  13.     for i in di():
  14.             m1.append(i)
  15.     m1.sort()
  16.     f = 0
  17.     count = 0
  18.     while True:
  19.         try:
  20.             t2 = m1.pop(0)
  21.             if f != t2:
  22.                 f = t2
  23.                 count =1
  24.             else:
  25.                 count +=1
  26.                 if count ==3:
  27.                     print(f)
  28.         except:
  29.             break
  30. s()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-27 09:53:25 | 显示全部楼层
本帖最后由 JAY饭 于 2018-2-27 10:02 编辑

验证了一下,答案是对的,但是全不全面就不敢肯定
1519696872(1).png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 04:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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