Java 项目12-优化
我正在工作。有没有人能提供一些建议,如何改进我的代码,使其在我的一生中执行Java 项目12-优化,java,Java,我正在工作。有没有人能提供一些建议,如何改进我的代码,使其在我的一生中执行 public class HighlyDivisibleTriangularNumber { public static void main(String[] args) { int divisors = 0; int count = 1; while(divisors <= 501) { long triNum = triangularNumber(count);
public class HighlyDivisibleTriangularNumber {
public static void main(String[] args) {
int divisors = 0;
int count = 1;
while(divisors <= 501) {
long triNum = triangularNumber(count);
divisors = getFactors(triNum);
System.out.println(triNum+"_"+divisors);
count++;
}
}
private static int getFactors(long triNum) {
int divisors = 0;
while(triNum > 1) {
triNum = triNum / 2;
divisors++;
}
return divisors;
}
private static long triangularNumber(int i) {
long total = 0;
for(int k = 1; k <= i; k++) {
total += k;
}
return total;
}
}
public类高整除数{
公共静态void main(字符串[]args){
整数除数=0;
整数计数=1;
while(除数1){
triNum=triNum/2;
除数++;
}
返回因子;
}
专用静态长三角形编号(int i){
长总计=0;
对于(int k=1;k为什么每次都要重新计算三元数?每次只需添加差值(基本上是您的计数)
但是12的除数是
1, 2, 3, 4 (= 2*2), 6 (= 2*3), 12
因此,总共有6个12的除数,而不是3,这仅仅是素因子分解可能会让你相信。1)三角数
你能做的第一个(可能也是最重要的)优化就是如何计算三角形数
可以观察到第n个三角形数(我们称之为t(n))等于n+t(n-1)。
因此,每次计算三角形数时,只需将三角形数加在前面,然后加上n。这将导致简单的递归函数:
private static long triangularNumber(int i) {
if(i == 1) return 1;
else return i+triangularNumber(i-1);
}
但这并不会大大提高性能……为了解决这个问题,我建议你做一些关于记忆的研究,并调整我给你的功能(我不会给你答案,这是一个很好的练习)
现在,在普通电脑上,你应该在合理的时间内找到问题的答案,但它可以改进一点
2)计算除数
你计算除数的函数是错误的。你应该试着用连续的自然数除以你的数,看看结果是否是一个自然整数
private static int getFactors(long triNum) {
int divisors = 0;
for(int i = 1; i <= triNum; ++i) {
if(triNum%i == 0) // triNum is a multiple of 1 <=> i is a divisor of triNum
divisors++;
}
return divisors;
}
private static int getFactors(长triNum){
整数除数=0;
对于(int i=1;我应该在……1:为什么每次都要重新计算triNum
.2:你没有真正测试因子的数量。你只需搜索2的一次幂大于你的数字。这部分应该完全重写。我将在while循环外声明triNum-但我可能仍然需要在循环中不断重新分配它,以便在满足终止条件时,我将知道va是什么三角形数的lue是。Edit:我看到了你的答案,现在明白你的意思了。谢谢。这个问题似乎离题了,因为它要求代码检查。三角形数n,T(n)的非递归公式是:n*(n+1)/2
private static long triangularNumber(int i) {
if(i == 1) return 1;
else return i+triangularNumber(i-1);
}
private static int getFactors(long triNum) {
int divisors = 0;
for(int i = 1; i <= triNum; ++i) {
if(triNum%i == 0) // triNum is a multiple of 1 <=> i is a divisor of triNum
divisors++;
}
return divisors;
}