今天看电影《知无涯着》看到的,所以想编程验证一下。

「的士数」在电影里和在维基百科上看到的故事来源是不一样的,鉴于维基百科更真实一些,所以此处引用维基百科关于「的士数」的故事:

拉马努金病重,哈代前往探望。哈代说:“我乘的士来,车牌号码是 1729,这数真没趣,希望不是不祥之兆。”拉马努金答道:“不,那是个有趣得很的数。可以用两个立方之和来表达而且有两种表达方式的数之中, 1729 是最小的。”(即 ${1729=1^{3}+12^{3}=9^{3}+10^{3}}$,后来这类数称为的士数。)利特尔伍德回应这宗轶闻说:“每个整数都是拉马努金的朋友。”

关于拉马努金:英国皇家学会院士(亚洲第一人),英属印度人,是英属印度史上最著名的数学家之一。

关于哈代:是他在剑桥三一学院任教的时候发现并帮助了拉马努金,可以说是拉马努金的伯乐。

关于利特尔伍德:人们常开玩笑说:利特尔伍德是哈代幻想出来的影子。两人经常合作。

那么该怎么定义「的士数」呢?还是直接引用维基百科:

第 n 个的士数(Taxicab number),一般写作${Ta}(n)$ 或 ${Taxicab}(n)$,定义为最小的数能以 n 个不同的方法表示成两个正立方数之和。

用 C++ 来求解的代码如下:

void printTaxicab2(int N) {
int ans = 1;
int count = 0;
while (count != N) {
int cur_count = 0;
for (double i = 1; i <= pow(ans, 1.0 / 3); ++ i) {
for (double j = i + 1; j <= pow(ans, 1.0 / 3); ++ j) {
if (i * i * i + j * j * j == ans) {
++ cur_count;
}
}
}
// 这里 n 取 2
if (cur_count == 2) {
++ count;
cout << ans << endl;
}

++ ans;
}
}

其实到目前为止也只是找出了 6 个的士数,它们分别是:

$Ta(1)=2=1^{3}+1^{3}$

$Ta(2)=1729=1^{3}+12^{3}=9^{3}+10^{3}$

$Ta(3)=87539319=167^{3}+436^{3}=228^{3}+423^{3}=255^{3}+414^{3}$

$Ta(4)=6963472309248=2421^{3}+19083^{3}=5436^{3}+18948^{3}=10200^{3}+18072^{3}=13322^{3}+16630^{3}$

$Ta(5)=48988659276962496=38787^{3}+365757^{3}=107839^{3}+362753^{3}=205292^{3}+342952^{3}=221424^{3}+336588^{3}=231518^{3}+331954^{3}$

$Ta(6)=24153319581254312065344=582162^{3}+28906206^{3}=3064173^{3}+28894803^{3}=8519281^{3}+28657487^{3}=16218068^{3}+27093208^{3}=17492496^{3}+26590452^{3}=18289922^{3}+26224366^{3}$