声明: 本文内容思路借鉴了网络上的一些前辈的文章,属于理解后的整理加工产物

题目如下:

img

1、示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.util.Scanner;
class test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("输入一个数作为上限");
int high = sc.nextInt() + 1;
int[] array = new int[high];
long sum = 0;
for(int i = 0; i < high; i++) { // 0~high之间的数的立方赋值给对应下标的数组元素
array[i] = i * i * i;
}
for(int i = 1; i < high; i++)
for(int j = 1; j < i ; j++) // 求和范围的左端
for(int k = j; k < i; k++) { // 右端
sum += array[k]; // 先累加求和
if(sum == array[i]) {
System.out.printf("%d^3 + ...... + %d^3 = %d^3\n", j, k, i);
sum = 0;
break;
}
if(sum > array[i] || k + 1 == i) { // 若sum已经大于目标值 或 已经累加到最右端
sum = 0; // 则初始化sum并跳出循环
break;
}
}
}
}

思想很简单:

  1. 先把每个数的立方值赋值给数组对应下标的元素;
  2. 对目标数字前的n-1个数可能出现的每一种情况分别累加求和,符合情况的就输出。

2、错误写法(只显示与最终代码不一样的地方,下同)

1
2
3
4
if(sum > array[i]) {	// 这是最终代码中的第二个if条件的错误写法示例
sum = 0;
break;
}

原因:可能出现 13+23+…+(n-1)3 < n3 这样的情况

3、不推荐写法
(1)改动的地方是下面的第三条语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
for(int i = 1; i < high; i++) {
for(int j = 1; j < i ; j++) { // 求和范围的左端
sum = 0; // 此处添加一条初始化sum的语句的话,思想与示例代码完全一致,但是会导致sum被重复初始化
for(int k = j; k < i; k++) { // 右端
sum += array[k]; // 先累加求和
}
if(sum == array[i]) {
System.out.printf("%d^3 + ...... + %d^3 = %d^3\n", j, k, i);
sum = 0;
break;
}
if(sum > array[i]) {
sum = 0;
break;
}
}
}

(2)或则是下面这一种写法(第二个if语句)

1
2
3
4
if(k + 1 == i) {// 这样虽然不会出现sum重复初始化的情况,
sum = 0; // 但是当出现 sum > array[i] 情况时,还会继续进行没有必要的循环
break;
}

likeqc
ends