挺好玩的壹個東西,寫著玩兒了.
用遞歸實現了壹個, 可以自定義 5 5 5 5 ,也可以額 ?5 5 6 6 , 也可以 5 5 5 6 6 6?
下面是代碼
import?java.util.ArrayList;import?java.util.List;
public?class?TestComputeUtil?{
public?static?void?main(String[]?args)?{
List<String>?rightExpressions?=?getRightExpressions(7,?6,5,5,7);
System.out.println(rightExpressions);
}
/**?
?*?工具方法,得到符合期望值的四則運算表達式,如果結果集size為0,則說明沒有結果?
?*
?*?<p>工具方法,得到正確的四則表達式</p>
?*?@param?result?期望得到的結果
?*?@param?parameter?所有的待計算的數字?例如:6,5,5,7
?*?@return?List<String>?復合要求的結果,如果size為0?,則說明沒有符合結果的內容
?*?@throws?
?*/?
public?static?List<String>?getRightExpressions(int?result?,?int...parameter){
List<String>?resultExpressions?=?new?ArrayList<String>();
if(parameter?==?null){
return?resultExpressions;?
}
computeResult(resultExpressions,new?StringBuilder().append(parameter[0]),?result?,?parameter[0]?,?1,?parameter);
return?resultExpressions;
}
/**?
?*?根據指針(index)的位置,來進行四則運算.?
?*
?*?<p>根據指針(index)的位置,來進行四則運算.</p>
?*?@param?resultExpressions?最終的結果集合,這裏省事兒了,直接傳進去了,當然,這種方法並不好,但省事兒,妳懂得,哈哈
?*?@param?expression?指針(index)前面所有的四則運算表達式
?*?@param?result?期望的計算結果
?*?@param?stepResult?指針(index)前面所有的四則運算表達式的結果
?*?@param?index?指針位置
?*?@param?parameter?參數數組
?*?@throws?
?*/?
private?static?void?computeResult(List<String>?resultExpressions,StringBuilder?expression?,?int?result?,Integer?stepResult,int?index?,?int[]?parameter){
if(parameter.length?>=?index+1){
computeResult(resultExpressions,?expression,?result,?stepResult,?index,?parameter,?CalculationSymbols.ADD);
computeResult(resultExpressions,?expression,?result,?stepResult,?index,?parameter,?CalculationSymbols.SUB);
computeResult(resultExpressions,?expression,?result,?stepResult,?index,?parameter,?CalculationSymbols.MULT);
computeResult(resultExpressions,?expression,?result,?stepResult,?index,?parameter,?CalculationSymbols.DIV);
}else?{
if(result?==?stepResult){
resultExpressions.add(expression.toString());
}
}
}
/**?
?*壹個計算流程包括遞歸調用computeResult(List<String>?resultExpressions,StringBuilder?expression?,?int?result?,Integer?stepResult,int?index?,?int[]?parameter)這個方法
?*
?*?<p>壹個計算流程?,?在這裏加減乘除都是壹個完整的計算流程.如果以後還想增加別的運算符號的話,只需要修改壹下計算方法,以及枚舉類.便於擴充</p>
?*?@param?resultExpressions?
?*?@param?expression
?*?@param?result
?*?@param?stepResult
?*?@param?index
?*?@param?parameter
?*?@param?sign?void
?*?@throws?
?*/?
private?static?void?computeResult(List<String>?resultExpressions,StringBuilder?expression?,?int?result?,Integer?stepResult,int?index?,?int[]?parameter?,?CalculationSymbols?sign){
StringBuilder?newExpression?=?new?StringBuilder(expression);
int?newResult?=?computeResult(stepResult,?parameter[index],?sign,?newExpression);
computeResult(resultExpressions,?newExpression,?result,?newResult,?index+1,?parameter);
}
/**
?*?計算?
?*
?*?<p>計算</p>
?*?@param?left?
?*?@param?right
?*?@param?sign
?*?@return?int
?*?@throws?
?*/?
private?static?int?computeResult(int?left?,?int?right?,?CalculationSymbols?sign,?StringBuilder?expression){
switch?(sign)?{
case?ADD:
expression.append("+").append(right);
return?left?+?right;
case?SUB:
expression.append("-").append(right);
return?left?-?right;
case?MULT:
expression.append("*").append(right);
return?left?*?right;
case?DIV:
expression.append("/").append(right);
return?left?/?right;
default:
throw?new?UnsupportedOperationException("不支持的操作類型!");
}
}
}
/**?
*?計算符號枚舉 *? *?<p>計算符號枚舉</p>? *?@author?an? *?@version?V1.0? */?enum?CalculationSymbols{
ADD,SUB,MULT,DIV
}
額,剛看到了壹個問題,是這樣的,不能用Integer , 需要把所有的Integer給替換成為Double,因為,1/2 = 0 ,妳懂的..只需要修改參數類型,以及計算的地方,即可
手打~~