Java题目:一些相续正整数的立方和正好等于另一个整数的立方
在MOOC上看到的题目,
示例:33 + 43 + 53 = 63
解题代码如下:
import java.util.ArrayList;
/**
* This program is designed for: 找到这样的整数:一些相续正整数的立方和正好等于另一个整数的立方
*
* @author Mr. Conductor
* @version 0.0.1 2020-10-14
*/
public class EqualCubeSumOfConsecutiveIntegersFinder {
public static void main(String[] args) {
EqualCubeSumOfConsecutiveIntegers eq = new EqualCubeSumOfConsecutiveIntegers(3); // 找3个
ArrayList<Integer[]> arr = eq.getArr();
StringBuilder strb = new StringBuilder();
for (Integer[] integers : arr) {
for(int i = integers[0]; i <= integers[1]; i ++)
{
strb.append("" + i + "^3 ");
if(i != integers[1]) strb.append("+ ");
}
strb.append("= " + integers[2] + "^3");
System.out.println(strb.toString());
strb.delete(0, strb.length());
}
}
}
class EqualCubeSumOfConsecutiveIntegers {
private ArrayList<Integer[]> arr = new ArrayList<Integer[]>();
public EqualCubeSumOfConsecutiveIntegers()
{
find(1);
}
private void find(int n) {
int first = 2;
label: // 一个first可能匹配到多个结果,设一个标记方便退出外循环
while(true)
{
double sum = Math.pow(first, 3.0);
int t = first + 1;
for(; t< 300; t++) // 300:自定义,到300停止,换一个first
{
sum += Math.pow(t, 3.0); // sum 是从 first 到 t 的立方和
double d = Math.pow(sum, 1.0/3.0); // d 是立方和开3次方
int dn = (int)Math.round(d); // dn 是立方和开3次方取整四舍五入,last的候选取值
// System.out.print("first=" + first + " t= " + t + " dn=" + dn + " d=" + d );
if((dn <= first + 1) || (Math.abs(d - dn ) > +1E-6)) // 如果取整前后差绝对值大于10^6,即开3次方后不是整数,continue
{
// System.out.println("pass");
continue;
}
// System.out.println();
Integer[] inte = {
first, t, dn};
addArr(inte);
n --;
// n为0时,已找到满足条件数量的匹配,退出外循环
// n不为0时,first不变,继续向后寻找下一个可能的匹配
if(n <= 0) break label;
}
first ++; // 此first已找完(在300以内),自增1
}
}
public EqualCubeSumOfConsecutiveIntegers(int n)
{
find(n);
}
@SuppressWarnings("unchecked")
public ArrayList<Integer[]> getArr() {
return (ArrayList<Integer[]>)arr.clone();
}
private void addArr(Integer[] inte)