鱼C论坛

 找回密码
 立即注册
查看: 4511|回复: 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 | 显示全部楼层
没有太好的想法,用个笨办法:
cube = [i ** 3 for i in range(22)] #这里是个“Bug”,先考虑立方数不大于10000
list1 = []
list2 = []
for i in range(1, 22):
    for j in range(i, 22):
        s = cube[i] + cube[j]
        list1.append(s)
for i in list1:
    if list1.count(i) == 2 and not i in list2:
        list2.append(i)
print(list2[1])
4104
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

n = 1730
while True:
    if isTexiNumber(n):
        print('第二小的的士数:', n)
        a = int(n ** (1/3) + 0.5)
        for i in range(1, a):
            for j in range(i, a+1):
                if i**3+j**3 == n:
                    print('{}**3 + {}**3 = {}'.format(i,j,n))
        break
    else:
        n += 1


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

使用道具 举报

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

def shi():
    for m,n,q in di():
        i,j,t = m,n,q
        for k in range(i+1,j-1):
            for l in range(k+1,j):
                if (k**3) + (l**3) == t:
                    print(t)

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

使用道具 举报

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

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

def di():
    for i in range(1,t1):
        for j in range(i+1,1000):
            f = t[i] + t[j]
            if f>=1000000000:
                break
            yield (f)

def s():
    m1 = []
    for i in di():
            m1.append(i)
    m1.sort()
    f = 0
    count = 0
    while True:
        try:
            t2 = m1.pop(0)
            if f != t2:
                f = t2
                count =1
            else:
                count +=1
                if count ==3:
                    print(f)
        except:
            break
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, 2025-1-18 18:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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