鱼C论坛

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

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

[复制链接]
发表于 2020-9-19 18:32:08 | 显示全部楼层 |阅读模式

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

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

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

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

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

这样的数后来被称作“的士数”,而1729是其中最小的。
求解出所有小于10000的“的士数
最佳答案
2020-9-19 20:32:59
本帖最后由 疾风怪盗 于 2020-9-20 21:10 编辑

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

n = 0
num_one=[]
num_two=[]
while n < 10000:
    num = isTexiNumber(n)
    if len(num)==1:
        num_one.append(num)
    elif len(num) == 2:
       num_two.append(num)
    n += 1
    
if len(num_one)>0:
    n1=pow(num_one[0][0][0],3)+pow(num_one[0][0][1],3)
    print(f'第一的士数为:{n1}')
    print(f'\t{n1} = {num_one[0][0][0]}**3 + {num_one[0][0][1]}**3')
if len(num_two)>0:
    n2=pow(num_two[0][0][0],3)+pow(num_two[0][0][1],3)
    print(f'第二的士数为:{n2}')
    print(f'\t{n2} = {num_two[0][0][0]}**3 + {num_two[0][0][1]}**3')
    print(f'\t{n2} = {num_two[0][1][0]}**3 + {num_two[0][1][1]}**3')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

发表于 2020-9-19 19:33:08 | 显示全部楼层
疾风怪盗 发表于 2020-9-19 19:22
https://fishc.com.cn/forum.php?mod=viewthread&tid=105640
这里有人问过了
不过看着好复杂。。。。。。 ...


楼主给出的“的士数”定义有问题,正确的应该是
第n个的士数为最小的数能以n个不同的方法表示成两个正立方数之和。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

太复杂了,溜了溜了。。。。。。
过几天再来看最佳答案。。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-19 20:06:38 | 显示全部楼层
不过我这个更难些,和那个不一样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-19 20:29:32 | 显示全部楼层
本帖最后由 风过无痕1989 于 2020-9-19 20:33 编辑

Python 语言我不会,我用 C 语言写了一个,得出 10000 以内只有两个数符合条件,它们是:1729 和 4104。
1729 = 1**3 + 12**3 = 9**3 + 10**3
4104 = 2**3 + 16**3 = 9**3 + 15**3
不过,这个程序重复的太多,请大神们帮我修改一下条件:
#include <stdio.h>

int main()
{
    int i,j,k,n,num1 = 0,num2 = 0;
    for (i = 1;i < 22;i++)
        {
        for(j = 1;j < 22;j++)
                {
                        if(i != j)
                        num1 = i * i * i + j * j * j;
                        for (k = 1;k < 22;k++)
                        {
                            for (n = 1;n < 22;n++)
                                {
                                        if(k != i && k != j && k != n && n != i && n != j)
                                        num2 = k * k * k + n * n * n;
                                        if(num1 == num2 && k != i && k != j && k != n && n != i && n != j)
                                        printf("%d  %d  %d  %d  %d\n",i,j,k,n,num1);
                                }
                                num2 = 0;
                        }
                        num2 = 0;
                }

        }
}


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

使用道具 举报

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

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

n = 0
num_one=[]
num_two=[]
while n < 10000:
    num = isTexiNumber(n)
    if len(num)==1:
        num_one.append(num)
    elif len(num) == 2:
       num_two.append(num)
    n += 1
    
if len(num_one)>0:
    n1=pow(num_one[0][0][0],3)+pow(num_one[0][0][1],3)
    print(f'第一的士数为:{n1}')
    print(f'\t{n1} = {num_one[0][0][0]}**3 + {num_one[0][0][1]}**3')
if len(num_two)>0:
    n2=pow(num_two[0][0][0],3)+pow(num_two[0][0][1],3)
    print(f'第二的士数为:{n2}')
    print(f'\t{n2} = {num_two[0][0][0]}**3 + {num_two[0][0][1]}**3')
    print(f'\t{n2} = {num_two[0][1][0]}**3 + {num_two[0][1][1]}**3')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-19 22:58:33 | 显示全部楼层
疾风怪盗 发表于 2020-9-19 20:32
按照之前帖子上写的,改了一下

第1个:1**3 + 12**3 = 1729

谢谢,你这个挺靠近正确答案的。题目意思是写出第一个和第二个的士数,就是2和1729,不过还是很感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-19 23:00:06 | 显示全部楼层
风过无痕1989 发表于 2020-9-19 20:29
Python 语言我不会,我用 C 语言写了一个,得出 10000 以内只有两个数符合条件,它们是:1729 和 4104。
1 ...

万分感谢,我连写都没写出来,谢谢了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-19 23:04:08 | 显示全部楼层
疾风怪盗 发表于 2020-9-19 20:32
按照之前帖子上写的,改了一下

第1个:1**3 + 12**3 = 1729

大佬能再帮我改改吗,改成“第一的士数为2
                                        第二的士数为1729”,谢谢您了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

输出效果你自己改改啊。。。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-20 10:43:49 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-9-20 10:46:26 | 显示全部楼层
疾风怪盗 发表于 2020-9-19 23:13
你说的2是什么,1万以内:第一个为1729,第二个为4104

第一的士数为:1729

这不是我刚学python嘛,大佬教教我,https://baike.so.com/doc/6807863-7024814.html这介链接就是说的士数的,1万以内第一个士数为2,第二个为1729
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-20 10:48:17 | 显示全部楼层
疾风怪盗 发表于 2020-9-19 23:13
你说的2是什么,1万以内:第一个为1729,第二个为4104

第一的士数为:1729

大佬,一的三次方加上一的三次方是2啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

用两个立方之和来表达而且有两种表达方式的数之中
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-20 17:13:52 | 显示全部楼层
疾风怪盗 发表于 2020-9-20 10:56
然后呢?的士数的题意,要两个等式,你要让2是的士数,1**3+1**3,那还需要一个等式也等于2才行

用两 ...

所以说“2”是第一的士数,它就一种表达方式
而1729是第二的士数,最小的第二的士数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


我到现在才明白一点。。。。。
怪不得百度百科上写得怎么不一样
第一的士数就是一个表达式
第二的士数就是二个表达式
第三的士数就是三个表达式
。。。。。。。。。。
好难理解的数学。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

n = 0
num_one=[]
num_two=[]
while n < 10000:
    num = isTexiNumber(n)
    if len(num)==1:
        num_one.append(num)
    elif len(num) == 2:
       num_two.append(num)
    n += 1
    
if len(num_one)>0:
    n1=pow(num_one[0][0][0],3)+pow(num_one[0][0][1],3)
    print(f'第一的士数为:{n1}')
    print(f'\t{n1} = {num_one[0][0][0]}**3 + {num_one[0][0][1]}**3')
if len(num_two)>0:
    n2=pow(num_two[0][0][0],3)+pow(num_two[0][0][1],3)
    print(f'第二的士数为:{n2}')
    print(f'\t{n2} = {num_two[0][0][0]}**3 + {num_two[0][0][1]}**3')
    print(f'\t{n2} = {num_two[0][1][0]}**3 + {num_two[0][1][1]}**3')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-20 20:12:20 | 显示全部楼层
疾风怪盗 发表于 2020-9-20 17:21
我到现在才明白一点。。。。。
怪不得百度百科上写得怎么不一样
第一的士数就是一个表达式 ...

我也是这么觉得,太难了,看了一个小时才懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-20 20:15:18 | 显示全部楼层

非常感谢,这次对了,谢谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-18 15:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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