鱼C论坛

 找回密码
 立即注册
查看: 2051|回复: 19

[已解决]学校里的算法练习

[复制链接]
发表于 2020-9-19 19:22:35 | 显示全部楼层
https://fishc.com.cn/forum.php?mod=viewthread&tid=105640
这里有人问过了
不过看着好复杂。。。。。。。。计算出来的和百度百科上说的也不一样
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-19 19:45:44 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-9-19 19:33
楼主给出的“的士数”定义有问题,正确的应该是

太复杂了,溜了溜了。。。。。。
过几天再来看最佳答案。。。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-19 20:32:59 | 显示全部楼层    本楼为最佳答案   
本帖最后由 疾风怪盗 于 2020-9-20 21:10 编辑

最后修改下:
  1. def isTexiNumber(n):
  2.     a = int(pow(n, 1 / 3) + 0.5)
  3.     num = []
  4.     for i in range(1, a+1):
  5.         for j in range(i, a+1):
  6.             if pow(i, 3) + pow(j, 3) == n:
  7.                 num.append((i, j))
  8.     return num

  9. n = 0
  10. num_one=[]
  11. num_two=[]
  12. while n < 10000:
  13.     num = isTexiNumber(n)
  14.     if len(num)==1:
  15.         num_one.append(num)
  16.     elif len(num) == 2:
  17.        num_two.append(num)
  18.     n += 1
  19.    
  20. if len(num_one)>0:
  21.     n1=pow(num_one[0][0][0],3)+pow(num_one[0][0][1],3)
  22.     print(f'第一的士数为:{n1}')
  23.     print(f'\t{n1} = {num_one[0][0][0]}**3 + {num_one[0][0][1]}**3')
  24. if len(num_two)>0:
  25.     n2=pow(num_two[0][0][0],3)+pow(num_two[0][0][1],3)
  26.     print(f'第二的士数为:{n2}')
  27.     print(f'\t{n2} = {num_two[0][0][0]}**3 + {num_two[0][0][1]}**3')
  28.     print(f'\t{n2} = {num_two[0][1][0]}**3 + {num_two[0][1][1]}**3')
复制代码

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

使用道具 举报

发表于 2020-9-19 23:13:23 | 显示全部楼层
‘林夕’ 发表于 2020-9-19 23:04
大佬能再帮我改改吗,改成“第一的士数为2
                                        第二的士数为1729 ...

你说的2是什么,1万以内:第一个为1729,第二个为4104
  1. n = 0
  2. count=0
  3. count_ch=['一','二','三','四']
  4. while n<10000:
  5.     num=isTexiNumber(n)
  6.     if len(num)>1:
  7.         print(f'第{count_ch[count]}的士数为:{n}')
  8.         for i in num:
  9.             print(f'\t{n} = {i[0]}**3 + {i[1]}**3')
  10.         count +=1
  11.     n +=1
复制代码

第一的士数为:1729
        1729 = 1**3 + 12**3
        1729 = 9**3 + 10**3
第二的士数为:4104
        4104 = 2**3 + 16**3
        4104 = 9**3 + 15**3

输出效果你自己改改啊。。。。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-20 10:56:35 | 显示全部楼层
‘林夕’ 发表于 2020-9-20 10:48
大佬,一的三次方加上一的三次方是2啊

然后呢?的士数的题意,要两个等式,你要让2是的士数,1**3+1**3,那还需要一个等式也等于2才行

用两个立方之和来表达而且有两种表达方式的数之中
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-20 17:21:31 | 显示全部楼层
‘林夕’ 发表于 2020-9-20 17:13
所以说“2”是第一的士数,它就一种表达方式
而1729是第二的士数,最小的第二的士数


我到现在才明白一点。。。。。
怪不得百度百科上写得怎么不一样
第一的士数就是一个表达式
第二的士数就是二个表达式
第三的士数就是三个表达式
。。。。。。。。。。
好难理解的数学。。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-20 17:45:58 | 显示全部楼层
‘林夕’ 发表于 2020-9-20 17:13
所以说“2”是第一的士数,它就一种表达方式
而1729是第二的士数,最小的第二的士数

改成这样试试
  1. def isTexiNumber(n):
  2.     a = int(pow(n, 1 / 3) + 0.5)
  3.     num = []
  4.     for i in range(1, a+1):
  5.         for j in range(i, a+1):
  6.             if pow(i, 3) + pow(j, 3) == n:
  7.                 num.append((i, j))
  8.     return num

  9. n = 0
  10. num_one=[]
  11. num_two=[]
  12. while n < 10000:
  13.     num = isTexiNumber(n)
  14.     if len(num)==1:
  15.         num_one.append(num)
  16.     elif len(num) == 2:
  17.        num_two.append(num)
  18.     n += 1
  19.    
  20. if len(num_one)>0:
  21.     n1=pow(num_one[0][0][0],3)+pow(num_one[0][0][1],3)
  22.     print(f'第一的士数为:{n1}')
  23.     print(f'\t{n1} = {num_one[0][0][0]}**3 + {num_one[0][0][1]}**3')
  24. if len(num_two)>0:
  25.     n2=pow(num_two[0][0][0],3)+pow(num_two[0][0][1],3)
  26.     print(f'第二的士数为:{n2}')
  27.     print(f'\t{n2} = {num_two[0][0][0]}**3 + {num_two[0][0][1]}**3')
  28.     print(f'\t{n2} = {num_two[0][1][0]}**3 + {num_two[0][1][1]}**3')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-11 05:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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