java 欧拉_java – 需要帮助优化解决方案的项目欧拉问题#12

我一直很乐意与Project Euler的挑战,我注意到,我的解决方案12是我的最慢速度,每次跑步达到593.275毫秒.这是我的解决方案第二,在每次穿越〜1254.593毫秒.我所有的其他答案都需要不到3 ms的时间才能在1 ms以内运行.

主要():

int index = 1;

long currTriangleNum = 1;

while (numDivisors(currTriangleNum) <= 500) {

index++;

currTriangleNum += index;

}

System.out.println(currTriangleNum);

numDivisors():

public static int numDivisors(long num) {

int numTotal = 0;

if (num > 1)

if (num % 2 == 0) {

for (long i = 1; i * i <= num; i++)

if (num % i == 0)

numTotal+=2;

} else {

// halves the time for odd numbers

for (long i = 1; i * i <= num; i+=2)

if (num % i == 0)

numTotal+=2;

}

else if (num == 0)

return 0;

else if (num == 1)

return 1;

else (num < 0)

return numDivisors(num *= -1);

return numTotal;

}

.

围绕解决方案论坛,有些人发现@L_403_2@(n =(p ^ a)(q ^ b)(r ^ c)…& d(n)=(a 1)(b 1) )…)为他们工作,但我个人不明白它会如何更快;手也可以更快,但不是在程序中.

.

基本思想过程如下:

我们想要计算48个除数的数量.通过查看下面的因子树,我们可以得出结论:48 =(2 ^ 4)(3 ^ 1)[n =(p ^ a)(q ^ b) ^ C)…].

48

/ \

2 24

/ \

2 12

/ \

2 06

/ \

2 3

知道这一点,我们构造公式d(48)=(4 1)(11)[d(n)=(a 1)(b 1)(c 1)…]来确定48个有10个因素.

d(n) = (a+1)(b+1)(c+1)...

d(48) = (4+1)(1+1)

d(48) = (5)(2)

d(48) = 10

.

如何优化我的代码?这些公式是最好的解决方案吗?我觉得找到所有的主要因素,然后执行公式将比我已经有的程序需要更长的时间.

非常感谢,

瑞斯蒂昂

编辑:

在任何人开始发布链接之前,我已经在SO中查看了类似的问题,没有任何运气 – 我只是想不到他们的方法的实现会比我已经有了更快的运行.

EDIT2:

我的第二次尝试在Eratosthenes筛选(对于问题10):

int p = 3,n = 2000000;

long total = 0;

boolean[] sieve = new boolean[n];

for (int i = 3; i < n; i += 2)

sieve[i] = true;

sieve[2] = true;

while (p * p < n) {

for (int i = p; i < n; i++)

if (sieve[i] && (i % p) == 0)

sieve[i] = false;

p++;

while (!sieve[p])

p++;

}

for (int i = 0; i < n; i++)

if (sieve[i])

total += i;

System.out.println(total);

运行在〜985.399 ms – 不会比其他方法快得多,但尚未优化.然而,它是有效的.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值