输入一自然数n,求组成n3的n个连续奇数

来源:互联网 发布:广州城中村网络被承包 编辑:程序博客网 时间:2024/04/30 07:05

/**
 * @classname:OddNumberTotal.java
 * @copyright:Dolphin Software Corporation
 * @author xulei
 * @date:Jun 25, 2010 9:40:38 AM
 * @version:1.0
 * @remark:
 */
package com.dol.dop.dataframearithmetic.arithmetic.util;

import java.util.HashMap;

public class OddNumberTotal
{

 /**
  * @param args
  * @return: void
  * @auther: xulei
  * @date:Jun 25, 2010 9:40:38 AM
  * @remarks: 任何一个自然数m的立方均可写成m个连续奇数之和。例如: 1^3=1
  *
  * 2^3=3+5
  *
  * 3^3=7+9+11
  *
  * 4^3=13+15+17+19
  *
  * 编程实现:输入一自然数n,求组成n3的n个连续奇数。
  *
  */
 public static void main(String[] args)
 {
  // TODO Auto-generated method stub
  OddNumberTotal odds = new OddNumberTotal();
  int n = 81;
  int total = odds.sum(n);
  System.out.println(n + " 的3次方 " + total+" 的连续奇数:");
  HashMap t = odds.getOddNumbers(total, n);

   for (int i = 0; i < t.size(); i++)
   {
    System.out.print(t.get(i) + "  ");
   }

 }

 /**
  * @param sum
  *            总和
  * @param n
  *            自然数
  * @return
  * @return: HashMap
  * @auther: xulei
  * @date:Jun 25, 2010 11:04:11 AM
  * @remarks:
  */
 private HashMap getOddNumbers(int sum, int n)
 {
  if (n <= 0)
  {
   System.out.println("请输入自然数");
   return null;
  }
  HashMap oddNumbers = new HashMap();
  // midOddNumber中间数,
  // tmp临时数据,保存midOddNumber初始值
  // count统计中间数的左右计算次数
  int midOddNumber, tmp, count = 0;

  midOddNumber = ((n % 2) == 1) ? sum / n : sum / n - 1;
  count = ((n % 2) == 1) ? n / 2 : (n / 2) - 1;
  tmp = midOddNumber;
  oddNumbers.put(count, tmp);
  // 为1时的处理
  if (midOddNumber == 1)
   return oddNumbers;
  //左边奇数
  for (int j = count - 1; j >= 0; j--)
  {
   midOddNumber = midOddNumber - 2;
   oddNumbers.put(j, midOddNumber);
  }
  //复原中间数
  midOddNumber = tmp;
  //右边奇数
  for (int j = count + 1; j <= n; j++)
  {
   midOddNumber = midOddNumber + 2;
   oddNumbers.put(j, midOddNumber);
  }

  // 当n^3中的n为偶数时需要去掉hashmap的最后一位数据
  if ((n % 2) != 1)
   oddNumbers.remove(n);

  return oddNumbers;
 }

 private int sum(int n)
 {
  int total = n * n * n;
  return total;
 }
}

 

 

 

 

 

 

汗,简单问题弄复杂了,这是优化后的算法:

 

package com.arithmetic;

import java.util.ArrayList;
import java.util.List;

/**
 * @author
 * 任何一个自然数m的立方均可写成m个连续奇数之和
 * 如:
 * 1 ^3 = 1;
 * 2 ^3 = 3 + 5;
 * 3 ^3 = 7 + 9 + 11;
 * 4 ^3 = 13 + 15 + 17 + 19
 * 5 ^3 = 21 + 23 + 25 + 27 + 29
 * 6 ^3 = 31 + 33 + 35 + 37 + 39 + 41;
 * 编程实现:输入一自然数m,求组成m3的m个连续奇数
 * 根据以上数据可以看到:
 * 第一个奇数为(m*(m-1))+1,又已知为m个连续奇数
 */
public class CubeSum {

 public static List<Integer> cubeFirst(int num) {
  List<Integer> returns = new ArrayList<Integer>();
  if (num <= 0) {
   return null;
  }
  if (num == 1) {
   returns.add(1);
   return returns;
  }
  //获得第一个奇数
  int firstOddNumber = (num * (num - 1)) + 1;
  returns.add(firstOddNumber);
  //遍历num-1次,获取所有奇数
  for (int i = 1; i < num; i++) {
   firstOddNumber = firstOddNumber + 2;
   returns.add(firstOddNumber);
  }
  return returns;
 }

 public static void main(String[] args) {
  List<Integer> result = CubeSum.cubeFirst(9);
  for (int i = 0; i < result.size(); i++) {
   System.out.print(result.get(i).intValue());
   if (i != result.size() - 1) {
    System.out.print("+");
   }
  }
 }
}

原创粉丝点击