[Hardy about Ramanujan]:我记得有一次他在普特尼生病时去看他。我曾坐过 1729 号出租车,并说这个号码在我看来是一个沉闷的数字,我希望这不是一个不祥之兆。“不,”他回答,“这是一个非常有趣的数字;它是可以用两种不同方式表示为两个立方体之和的最小数字。”
两种不同的方式是 1³ + 12³ 和 9³ + 10³
我正在编写一系列函数(用 C 语言)来计算与 Ramanujan 数字相关的不同事物。我现在正在尝试编写一个返回第i 个Ramanujan 数字的函数。由于我已经创建了一个检查数字是否为拉马努金数字的函数,因此简单的方法是检查从 0 到无穷大的每个数字。如果给定数字是 Ramanujan 数字,则将计数器加一。一旦计数器等于我要查找的索引,我就会返回该数字。在代码中:
unsigned long ramanujan_index (unsigned long x, int counter, int index)
{
if (counter == index)
return x - 1;
if (is_ramanujan(x))
return ramanujan_index(x + 1, counter + 1, index);
else
return ramanujan_index(x + 1, counter, index);
}
它确实有效,但我有点担心它的效率可能没有那么高。检查每个数字似乎不是最好的解决方案。如果我们考虑第一个数字是 1729,第二个是 4104,则更是如此。似乎要找到第 5 个 Ramanujan 数字需要相当多的步骤(实际上是 32832 步骤,因为它必须检查从 0 开始的每个数字到 32832,这是第 5 个数字)。有更好的方法吗?