【发布时间】:2020-08-20 18:08:30
【问题描述】:
众所周知,任何正数最多可以用 3 个三角数来表示。 ( https://oeis.org/A000217)
例子:
11 := 10 + 1
12 := 10 + 1 + 1
13 := 10 + 3
14 := 10 + 3 + 1
15 := 15
我正在通过最多 3 个可能的三角形加法搜索正数 n 的表示。 n 可以存在不止一种表示形式。我对总和最大的那个很感兴趣。
有没有比 2 减 for 和 1 增 for 循环更有效的方法来找到和数?
public void printMaxTriangularNumbers(int n){
int[] tri = createTriangularNumbers(1000);
lbl: for(int i = tri.length-1; ; i--){
int tmp = n - tri[i];
if(tmp == 0){
System.out.println(tri[i]);
break;
}
for(int j=i; j>0; j--){
int tmp2 = tmp - tri[j];
if(tmp2 ==0){
System.out.println(tri[i]);
System.out.println(tri[j]);
break lbl;
}
for(int k=1; k <= j;k++){
if(tmp2 - tri[k] == 0){
System.out.println(tri[i]);
System.out.println(tri[j]);
System.out.println(tri[k]);
break lbl;
}
}
}
}
}
public int[] createTriangularNumbers(int n){
int[] out = new int[n+1];
for(int i=1,sum=0; i<=n;i++){
out[i] = sum += i;
}
return out;
}
【问题讨论】:
-
请解释三角数是什么,并为您描述的解决方案显示代码的minimal reproducible example。展示胜于描述,尤其是在代码方面。
-
14 不是三角数。
-
你是对的!更新了问题。
-
我认为您的问题更适合数学领域,最好在 Math Stack Exchange site 上提出。
-
我认为三角数是一个整数
k,因此存在一个整数j和k = j (j + 1) /2。鉴于此,您需要解决2 n = j1 (j1 + 1) + j2 (j2 + 1) + j3 (j3 + 1)的一些整数j1、j2、j3。这是具有三个变量的二次丢番图方程。也许对这些术语进行网络搜索会找到一些资源。另外,我赞同 math.stackexchange.com 的建议。
标签: java algorithm math numbers triangular