Ⅰ 24點速算游戲 java 代碼
- importjava.util.ArrayList;
- importjava.util.Arrays;
- importjava.util.Collection;
- importjava.util.HashSet;
- importjava.util.List;
- importjava.util.Set;
- /**
- *用給定的4個整數通過加減乘除運算得到24點,如果有多種情況,則全部輸出,如果不能得到24點,輸出提示<br>
- *
- *@思路:將指定的4個數字進行全排列,將運算符『+』、『-』、『*』、『/』取3個進行所有情況排列,
- *然後將所有的數字排列與所有的運算符排列按順序計算,
- *如果最後計算結果等於想要的結果值比如24,則為符合條件的運算,
- *將所有符合條件的數字排列和運算符排列存儲起來,並在最後列印輸出所有可能的情況
- *
- *@authorchenjie
- *
- */
- publicclassTwentyFourPoint{
- publicstaticvoidmain(String[]args){
- try{
- Set<String>set=caculate(newint[]{18,18,6,12},24);
- printlnResultSet(set);
- }catch(Exceptione){
- //e.printStackTrace();開發期間方便查找錯誤,測試通過後就無需列印錯誤信息了
- System.err.println(e.getMessage());
- }
- }
- /**
- *列印結果集
- *
- *@paramresultSet
- *結果集
- */
- (Collection<String>resultSet){
- for(Stringstr:resultSet){
- System.out.println(str);
- }
- }
- /**
- *得到給定整形數組的全排列情況
- *
- *@paramnumbers
- *給定的整形數組
- *@return全排列數組
- */
- privatestaticint[][]arrangeAllNumbers(int[]numbers){
- List<int[]>list=newArrayList<int[]>();
- allSort(numbers,0,numbers.length-1,list);
- int[][]resultSet=newint[list.size()][list.get(0).length];
- resultSet=list.toArray(resultSet);
- returnresultSet;
- }
- /**
- *得到給定的操作中出現的所有操作符排列情況
- *
- *@paramoperators
- *出現的操作符數組
- *@paramnumber
- *每組操作符的數量
- *@return所有操作符排列數組
- */
- privatestaticchar[][]arrangeAllOperators(char[]operators,intnumber){
- intsetSize=(int)Math.pow(operators.length,number);
- intindex=0;
- char[][]resultSet=newchar[setSize][number];
- for(inti=0;i<operators.length;i++){
- for(intj=0;j<operators.length;j++){
- for(intk=0;k<operators.length;k++){
- resultSet[index][0]=operators[i];
- resultSet[index][1]=operators[j];
- resultSet[index][2]=operators[k];
- index++;
- }
- }
- }
- returnresultSet;
- }
- /**
- *根據給定的一組整數,通過加減乘除運算,得到想要的結果,如果可以得到結果,則返回所有可能的結果的運算形式。
- *返回的運算形式,均按從左到右的順序計算,並不是遵循四則運演算法則,比如:<br>
- *輸出的結果形式為:<br>
- *1*8-6*12=24<br>
- *表示的運算順序是:<br>
- *1:1*8=8,<br>
- *2:8-6=2,<br>
- *3:2*12=24<br>
- *而不是按照四則運演算法則計算:<br>
- *1:1*8=8,<br>
- *2:6*12=72,<br>
- *3:8*72=576<br>
- *
- *
- *@paramnumbers
- *給定進行運算的一組整數,4個數為一組
- *@paramtargetNumber
- *想要得到的結果
- *@return所有可能得到想要的結果的所有運算形式的字元串形式集合
- *@throwsException
- *如果不能得到想要的結果,則拋出該異常,表明根據指定的一組數字通過一系列的加減乘除不能得到想要的結果
- */
- publicstaticSet<String>caculate(int[]numbers,inttargetNumber)
- throwsException{
- Set<String>resultSet=newHashSet<String>();//這里用Set而不是用List,主要是因為當給定的一組數字中如果有重復數字的話,同一結果會被出現多次,如果用List存放的話,會將重復的結果都存放起來,而Set會自動消除重復值
- char[][]operatorsArrangement=arrangeAllOperators(newchar[]{'+',
- '-','*','/'},3);
- int[][]numbersArrangement=arrangeAllNumbers(numbers);
- for(int[]nums:numbersArrangement)
- for(char[]operators:operatorsArrangement){
- intresult=0;
- try{
- result=caculate(nums,operators);
- }catch(Exceptione){//出現非精確計算
- continue;
- }
- if(result==targetNumber)
- resultSet.add(buildString(nums,operators,targetNumber));//如果計算後的結果等於想要的結果,就存放到集合中
- }
- if(resultSet.isEmpty())
- thrownewException("給定的數字:"+Arrays.toString(numbers)
- +"不能通過加減乘除運算得到結果:"+targetNumber);
- returnresultSet;
- }
- /**
- *將一組整型數字以給定的操作符按順序拼接為一個完整的表達式字元串
- *
- *@paramnums
- *一組整型數字
- *@paramoperators
- *一組操作符
- *@paramtarget
- *目標值
- *@return拼接好的表達式字元串
- */
- (int[]nums,char[]operators,inttarget){
- Stringstr=String.valueOf(nums[0]);
- for(inti=0;i<operators.length;i++){
- str=str+''+operators[i]+''+nums[i+1];
- }
- str=str+"="+target;
- returnstr;
- }
- /**
- *將給定的一組數字以給定的操作符按順序進行運算,如:intresult=caculate(newint[]{3,4,5,8},new
- *char[]{'+','-','*'});
- *
- *@paramnums
- *一組數字
- *@paramoperators
- *一組運算符,數量為數字的個數減1
- *@return最後的計算結果
- *@throwsException
- *當計算結果不精確時,拋出該異常,主要是針對除法運算,例如18/8=2,諸如這樣不精確計算將拋出該異常
- */
- privatestaticintcaculate(int[]nums,char[]operators)throwsException{
- intresult=0;
- for(inti=0;i<operators.length;i++){
- if(i==0){
- result=caculate(nums[i],nums[i+1],operators[i]);
- }else{
- result=caculate(result,nums[i+1],operators[i]);
- }
- }
- returnresult;
- }
- /**
- *根據指定操作符將兩個給定的數字進行計算
- *
- *@paramnum1
- *數字1
- *@paramnum2
- *數字2
- *@paramoperator
- *操作符,只能從「+、-、*、/」4個操作符中取值
- *@return計算結果
- *@throwsException
- *當計算結果不精確時,拋出該異常,主要是針對除法運算,例如18/8=2,諸如這樣不精確計算將拋出該異常
- */
- privatestaticintcaculate(intnum1,intnum2,charoperator)
- throwsException{
- doubleresult=0;
- switch(operator){//根據操作符做相應的計算操作
- case'+':
- result=num1+num2;
- break;
- case'-':
- result=num1-num2;
- break;
- case'*':
- result=num1*num2;
- break;
- case'/':
- result=(double)num1/(double)num2;
- break;
- }
- if(!check(result))
- thrownewException("不精確的計算數字");
- return(int)result;
- }
- /**
- *檢查指定的浮點數是否可以直接轉換為整型數字而不損失精度
- *
- *@paramresult
- *要檢查的浮點數
- *@return如果可以進行無損轉換,返回true,否則返回false
- */
- privatestaticbooleancheck(doubleresult){
- Stringstr=String.valueOf(result);
- intpointIndex=str.indexOf(".");//小數點的下標值
- Stringfraction=str.substring(pointIndex+1);
- returnfraction.equals("0")?true:false;//通過判斷小數點後是否只有一個0來確定是否可以無損轉換為整型數值
- }
- /**
- *對傳入的整型數組buf進行全排列
- *
- *@parambuf
- *要進行全排列的整型數組
- *@paramstart
- *開始的下標值
- *@paramend
- *結束下標值
- *@paramlist
- *保存最後全排列結果的集合
- */
- privatestaticvoidallSort(int[]buf,intstart,intend,List<int[]>list){
- if(start==end){//當只要求對數組中一個字母進行全排列時,只要就按該數組輸出即可
- int[]a=newint[buf.length];
- System.array(buf,0,a,0,a.length);
- list.add(a);
- }else{//多個字母全排列
- for(inti=start;i<=end;i++){
- inttemp=buf[start];//交換數組第一個元素與後續的元素
- buf[start]=buf[i];
- buf[i]=temp;
- allSort(buf,start+1,end,list);//後續元素遞歸全排列
- temp=buf[start];//將交換後的數組還原
- buf[start]=buf[i];
- buf[i]=temp;
- }
- }
- }
- }
Ⅱ 用JAVA設計算24點的游戲的隨機數字問題
public void randFour(){
int[] a=new int[4];
for(int i=0;i<a.length;i++){
a[i]=(int)( Math.random()*20+1);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("第"+(i+1)+"個數:"+a[i]);
}
}
Ⅲ java 分別 取昨天零點 和 二十四點
new date()獲取當前系統時間,在設置小時,分鍾,秒數位0點的,轉化為毫秒數,減去24小時的毫秒數,再轉化成時間對象,就是的了,第二個同樣