我还不是一个熟练的程序员,但我认为这是一个有趣的问题,我想我会给予它一个去。
三角形、五边形和六边形数由以下公式生成:
- 三角形T_(n)=n(n+1)/2 1,3,6,10,15,...
- 五边形P_(n)=n(3 n −1)/2 1,5,12,22,35,...
- 六边形H_(n)=n(2n−1)1,6,15,28,45,...
T_(285)= P_(165)= H_(143)= 40755。
找出下一个三角形数,它也是五边形和六边形。
是任务描述。
我知道六边形数是三角形数的一个子集,这意味着你只需要找到一个Hn=Pn的数字。但是我似乎无法让我的代码工作。我只知道java语言,这就是为什么我在网上找不到解决方案的原因。无论如何,希望有人能帮助。这是我的代码
public class NextNumber {
public NextNumber() {
next();
}
public void next() {
int n = 144;
int i = 165;
int p = i * (3 * i - 1) / 2;
int h = n * (2 * n - 1);
while(p!=h) {
n++;
h = n * (2 * n - 1);
if (h == p) {
System.out.println("the next triangular number is" + h);
} else {
while (h > p) {
i++;
p = i * (3 * i - 1) / 2;
}
if (h == p) {
System.out.println("the next triangular number is" + h); break;
}
else if (p > h) {
System.out.println("bummer");
}
}
}
}
}
我意识到这可能是一个非常缓慢和低效的代码,但这并不关心我在这一点上,我只关心找到下一个数字,即使它会采取我的电脑年。
4条答案
按热度按时间juzqafwq1#
我们知道T285 = P165 = H143 = 40755。我们从
nt=286
,np=166
和nh=144
开始,分别计算出三角形,五边形和六边形的数字。无论哪个数字最小,我们都将其n
的值提高。继续这样做,直到所有数字都相等,你就得到了答案。这个算法的Python实现在我的计算机上运行时间为0.1秒。
您的代码存在溢出问题。当答案适合32位
int
时,临时值i * (3 * i - 1)
在到达答案之前溢出。使用64位long
值修复您的代码。sirbozc52#
你的代码看起来会很快产生正确的答案。如果你在循环结束后打印结果,while循环可以简化:
注意:你的内部循环看起来很像我的C++解决方案的内部循环,它在我的机器上大约0.002秒就产生了想要的答案。
xxls0lw83#
另一种需要2 ms的解决方案:
改善:
k*(2*k-1)
可以写成如下形式i*(i+1)/2
,如果i = 2*k-1
。isTriangle
。cvxl0en24#
数学
关键是:
ti = hi*2 - 1
其中
ti
和hi
分别是T和H的索引。这意味着对于任何
H(hi)
,总是有一个T(ti)
。因而只需要求出
P(pi)
=H(hi)
,并即可以线性求解。代码
golang
)*结果
大约花了
2ms
。它花费了大约
5.4s
,有4个这样的值,不包括开始的(1,1,1)
。