思路一(思路有点长了):
import java.util.*; /* * 验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和。 */ public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(sc.hasNextInt()){ int num = sc.nextInt(); // 立方值 int value = num * num * num; // 连续奇数最大最小的差 int differMinMax = 2 * (num - 1); // 连续奇数最大最小的值范围 int min = value / num - differMinMax; if(min % 2 == 0){ min -= 1; } int max = value / num + differMinMax; if(max % 2 == 0){ max += 1; } // 找符合条件的连续奇数 int sum = 0; // 直接使用treeSet,排序(连续奇数不可能有重复,故直接使用TreeSet默认排序) TreeSet<Integer> nums = new TreeSet<Integer>(); // 每次--2,作为连续奇数最大的 for (int i = max; i >= min; i = i - 2) { sum = 0; nums = new TreeSet<Integer>(); int numTemp = i; sum += numTemp; nums.add(numTemp); // 求当前最大奇数,连续的num个奇数和 for (int j = 1; j < num ; j++) { numTemp = numTemp - 2; sum += numTemp; nums.add(numTemp); } if (sum == value){ break; } } // 输出连续奇数和形式 StringBuffer sb = new StringBuffer(); Iterator it = nums.iterator(); while (it.hasNext()){ sb.append(it.next()+"+"); } // 去掉最后一个多余+,substring下标位置,前包后不包 System.out.println(sb.substring(0,sb.length()-1)); } } }
思路二使用等差数列:
import java.util.*; /* * 验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和。 * 这里连续奇数是等差数列 */ public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(sc.hasNextLong()){ long n = sc.nextLong(); // 该题已知Sn = n^3,n = n,d = 2,故根据等差数列(相关知识如下图)相关公式,可以求出a1 long a1 = n * n - n + 1; System.out.print(a1); for(int i=1; i<m ; i++){ System.out.print("+" + (a1 += 2)); } System.out.println(); } } }
参考链接:http://www.360doc.com/content/18/0727/07/47813312_773519742.shtml