Java机试题:验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和。(等差数列)

思路一(思路有点长了):

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();
        }
    }
}

Java机试题:验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和。(等差数列)

 

 参考链接:http://www.360doc.com/content/18/0727/07/47813312_773519742.shtml

上一篇:【思特奇杯·云上蓝桥-算法集训营】第2周 08-未名湖边的烦恼


下一篇:MySQL经典50题(建表、数据、题目列表及个人答案)