前些日子在群里討論,有一個哥們出一道題:5,6,7,8,9,10按順序插入+-*/和括號,得到結果2000.
大家的先沉默了一會,二分鐘后,有人說這題沒意思。呵呵。口算還是有點難的。于是我說,可以寫個程序試一試。結果,花了三個小時,寫完了
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
/**
* @author Sam Wang
* @since Mar 22, 2011
*/
public class Demo {
public static void main(String[] args) {
double[] arr = { 5, 6, 7, 8, 9, 10 };
double[] arrTemp = null;
int random = 0;
double last = 0;
StringBuffer sb = null;
Set<String> results = new HashSet<String>();
for (int i = 0; i < 100000; i++) {
arrTemp = arr.clone();
shuffle(arrTemp);
sb = new StringBuffer();
sb.append(arrTemp[0]);
for (int j = 1; j < arrTemp.length; j++) {
random = (int) (Math.random() * 4);
switch (random) {
case 0:
sb.append("+").append(arrTemp[j]);
arrTemp[j] = arrTemp[j - 1] + arrTemp[j];
break;
case 1:
sb.append("-").append(arrTemp[j]);
arrTemp[j] = arrTemp[j - 1] - arrTemp[j];
break;
case 2:
sb.append("*").append(arrTemp[j]);
arrTemp[j] = arrTemp[j - 1] * arrTemp[j];
break;
case 3:
sb.append("/").append(arrTemp[j]);
arrTemp[j] = arrTemp[j - 1] / arrTemp[j];
break;
default:
break;
}
}
last = arrTemp[arrTemp.length - 1];
System.out.println(last);
if (last == 2000) {
sb.append("=2000");
results.add(sb.toString());
}
}
for (Iterator<String> it = results.iterator(); it.hasNext();) {
String item = it.next();
System.out.println(item);
}
}
/**
* @param arrTemp
* @return void 打亂數組元素順序。
*/
private static void shuffle(double[] arrTemp) {
int index = 0;
for (int i = 0; i < arrTemp.length; i++) {
index = (int) (Math.random() * arrTemp.length);
swap(arrTemp, i, index);
}
}
/**
* @param arrTemp
* @param i
* @param index
* 交換數據元素
*/
private static void swap(double[] arrTemp, int i, int index) {
double temp = arrTemp[i];
arrTemp[i] = arrTemp[index];
arrTemp[index] = temp;
}
}
有兩個技巧:在不確定是+-*/哪種情況下,可以random一下,多for幾次,那么這幾種情況大致上可以照顧到。
()在算法里面的體現是,使用()我發現,數字的前后順序可以混亂。打印出結果不行的話再刪除不遲。
打印結果:
9.0*8.0-7.0*6.0+10.0*5.0=2000
8.0*9.0-7.0*6.0+10.0*5.0=2000
7.0*8.0+9.0*6.0+10.0*5.0=2000
打印出來的效果不太好,我組織一下:
5*(6*(-7+8*9)+10)=2000;
5*(6*(7*8+9)+10)=2000;
如果,不允許取負數的話,當然就只有一個結果了。
有點疑惑,為什么Collection.shuffle()可以,Array.shuffle()卻不提供。
當然,算法肯定有可以改進的地方。