日期:2014-05-20  浏览次数:20821 次

算法题求助,请写出解题步骤,用JAVA实现
将5,6,7,8,9添加下面的空格里,使他们的积有最大值。
  
  __ __ __ × __ __
使用穷举法,把5个数字循环判断放入数组,最大的值就是要找的值。

------解决方案--------------------
就是个全排列的算法,定义一个数组int number[]={5,6,7,8,9};
进行全排列
取前三个number[0],number[1],number[2]作为第一个数的百位十位个位
后两个作为另一个数字
------解决方案--------------------

package shili;
import java.util.LinkedList;
import java.util.List;

/** *//**
* 将5,6,7,8,9添入到下面的算式中,使得他们的积有最大值
* _ _ _ * _ _ (即三位数乘以两位数的形式),要求求出最大乘积的结果和算式。
* @author sitinspring(junglesong@gmail.com)
* @since 2008-6-11 上午10:17:57
* @vsersion 1.00 创建 sitinspring 2008-6-11 上午10:17:57
*/
public class MaxMultiResult{
/** *//**
* 存储全排列后数组的链表
*/
private List<Integer[]> ls;

/** *//**
* 构造函数
* @param arr
*/
public MaxMultiResult(Integer[] arr){
ls=new LinkedList<Integer[]>();

// 进行全排列,将排列后的结果放入链表
permutation(arr,0,arr.length);

// 遍历查找乘积的最大值
int multiResult=0;
int op1=0;
int op2=0;
for(Integer[] arrTmp:ls){
int op1Tmp=arrTmp[0]*100+arrTmp[1]*10+arrTmp[2];
int op2Tmp=arrTmp[3]*10+arrTmp[4];
int multiResultTmp=op1Tmp*op2Tmp;
// 输出临时结果
System.out.println("乘积为"+multiResultTmp+" 算式为:"+op1Tmp+"*"+op2Tmp);

if(multiResultTmp>multiResult){
multiResult=multiResultTmp;
op1=op1Tmp;
op2=op2Tmp;
}
}

// 输出最大乘积,乘数,被乘数
System.out.println("最大乘积为"+multiResult+" 算式为:"+op1+"*"+op2);
}

/** *//**
* 全排列,将排列结果变成新数组存入链表
* @param arr
* @param start
* @param end
*/
private void permutation(Integer[] arr,int start,int end){
if(start<end+1){
permutation(arr,start+1,end);

for(int i=start+1;i<end;i++){
Integer temp;

temp=arr[start];
arr[start]=arr[i];
arr[i]=temp;

permutation(arr,start+1,end);

temp=arr[i];
arr[i]=arr[start];
arr[start]=temp;
}
}
else{
// 创建新数组
Integer[] arrNew=new Integer[arr.length];
for(int i=0;i<arrNew.length;i++){
arrNew[i]=new Integer(arr[i]);
}

// 将新数组放入链表
ls.add(arrNew);

// 输出新数组
/**//*for(int i=0;i<end;i++){
System.out.print(arrNew[i]+",");
}
System.out.print("\n");*/
}
}

/** *//**
* 程序入口
* @param args
*/
public static void main(String[] args){
Integer[] arr={5,6,7,8,9};
new MaxMultiResult(arr);
}
}