Ⅰ 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小时的毫秒数,再转化成时间对象,就是的了,第二个同样