导航:首页 > 源码编译 > 24点算法java

24点算法java

发布时间:2023-09-05 08:54:06

Ⅰ 24点速算游戏 java 代码

  1. importjava.util.ArrayList;
  2. importjava.util.Arrays;
  3. importjava.util.Collection;
  4. importjava.util.HashSet;
  5. importjava.util.List;
  6. importjava.util.Set;
  7. /**
  8. *用给定的4个整数通过加减乘除运算得到24点,如果有多种情况,则全部输出,如果不能得到24点,输出提示<br>
  9. *
  10. *@思路:将指定的4个数字进行全排列,将运算符‘+’、‘-’、‘*’、‘/’取3个进行所有情况排列,
  11. *然后将所有的数字排列与所有的运算符排列按顺序计算,
  12. *如果最后计算结果等于想要的结果值比如24,则为符合条件的运算,
  13. *将所有符合条件的数字排列和运算符排列存储起来,并在最后打印输出所有可能的情况
  14. *
  15. *@authorchenjie
  16. *
  17. */
  18. publicclassTwentyFourPoint{
  19. publicstaticvoidmain(String[]args){
  20. try{
  21. Set<String>set=caculate(newint[]{18,18,6,12},24);
  22. printlnResultSet(set);
  23. }catch(Exceptione){
  24. //e.printStackTrace();开发期间方便查找错误,测试通过后就无需打印错误信息了
  25. System.err.println(e.getMessage());
  26. }
  27. }
  28. /**
  29. *打印结果集
  30. *
  31. *@paramresultSet
  32. *结果集
  33. */
  34. (Collection<String>resultSet){
  35. for(Stringstr:resultSet){
  36. System.out.println(str);
  37. }
  38. }
  39. /**
  40. *得到给定整形数组的全排列情况
  41. *
  42. *@paramnumbers
  43. *给定的整形数组
  44. *@return全排列数组
  45. */
  46. privatestaticint[][]arrangeAllNumbers(int[]numbers){
  47. List<int[]>list=newArrayList<int[]>();
  48. allSort(numbers,0,numbers.length-1,list);
  49. int[][]resultSet=newint[list.size()][list.get(0).length];
  50. resultSet=list.toArray(resultSet);
  51. returnresultSet;
  52. }
  53. /**
  54. *得到给定的操作中出现的所有操作符排列情况
  55. *
  56. *@paramoperators
  57. *出现的操作符数组
  58. *@paramnumber
  59. *每组操作符的数量
  60. *@return所有操作符排列数组
  61. */
  62. privatestaticchar[][]arrangeAllOperators(char[]operators,intnumber){
  63. intsetSize=(int)Math.pow(operators.length,number);
  64. intindex=0;
  65. char[][]resultSet=newchar[setSize][number];
  66. for(inti=0;i<operators.length;i++){
  67. for(intj=0;j<operators.length;j++){
  68. for(intk=0;k<operators.length;k++){
  69. resultSet[index][0]=operators[i];
  70. resultSet[index][1]=operators[j];
  71. resultSet[index][2]=operators[k];
  72. index++;
  73. }
  74. }
  75. }
  76. returnresultSet;
  77. }
  78. /**
  79. *根据给定的一组整数,通过加减乘除运算,得到想要的结果,如果可以得到结果,则返回所有可能的结果的运算形式。
  80. *返回的运算形式,均按从左到右的顺序计算,并不是遵循四则运算法则,比如:<br>
  81. *输出的结果形式为:<br>
  82. *1*8-6*12=24<br>
  83. *表示的运算顺序是:<br>
  84. *1:1*8=8,<br>
  85. *2:8-6=2,<br>
  86. *3:2*12=24<br>
  87. *而不是按照四则运算法则计算:<br>
  88. *1:1*8=8,<br>
  89. *2:6*12=72,<br>
  90. *3:8*72=576<br>
  91. *
  92. *
  93. *@paramnumbers
  94. *给定进行运算的一组整数,4个数为一组
  95. *@paramtargetNumber
  96. *想要得到的结果
  97. *@return所有可能得到想要的结果的所有运算形式的字符串形式集合
  98. *@throwsException
  99. *如果不能得到想要的结果,则抛出该异常,表明根据指定的一组数字通过一系列的加减乘除不能得到想要的结果
  100. */
  101. publicstaticSet<String>caculate(int[]numbers,inttargetNumber)
  102. throwsException{
  103. Set<String>resultSet=newHashSet<String>();//这里用Set而不是用List,主要是因为当给定的一组数字中如果有重复数字的话,同一结果会被出现多次,如果用List存放的话,会将重复的结果都存放起来,而Set会自动消除重复值
  104. char[][]operatorsArrangement=arrangeAllOperators(newchar[]{'+',
  105. '-','*','/'},3);
  106. int[][]numbersArrangement=arrangeAllNumbers(numbers);
  107. for(int[]nums:numbersArrangement)
  108. for(char[]operators:operatorsArrangement){
  109. intresult=0;
  110. try{
  111. result=caculate(nums,operators);
  112. }catch(Exceptione){//出现非精确计算
  113. continue;
  114. }
  115. if(result==targetNumber)
  116. resultSet.add(buildString(nums,operators,targetNumber));//如果计算后的结果等于想要的结果,就存放到集合中
  117. }
  118. if(resultSet.isEmpty())
  119. thrownewException("给定的数字:"+Arrays.toString(numbers)
  120. +"不能通过加减乘除运算得到结果:"+targetNumber);
  121. returnresultSet;
  122. }
  123. /**
  124. *将一组整型数字以给定的操作符按顺序拼接为一个完整的表达式字符串
  125. *
  126. *@paramnums
  127. *一组整型数字
  128. *@paramoperators
  129. *一组操作符
  130. *@paramtarget
  131. *目标值
  132. *@return拼接好的表达式字符串
  133. */
  134. (int[]nums,char[]operators,inttarget){
  135. Stringstr=String.valueOf(nums[0]);
  136. for(inti=0;i<operators.length;i++){
  137. str=str+''+operators[i]+''+nums[i+1];
  138. }
  139. str=str+"="+target;
  140. returnstr;
  141. }
  142. /**
  143. *将给定的一组数字以给定的操作符按顺序进行运算,如:intresult=caculate(newint[]{3,4,5,8},new
  144. *char[]{'+','-','*'});
  145. *
  146. *@paramnums
  147. *一组数字
  148. *@paramoperators
  149. *一组运算符,数量为数字的个数减1
  150. *@return最后的计算结果
  151. *@throwsException
  152. *当计算结果不精确时,抛出该异常,主要是针对除法运算,例如18/8=2,诸如这样不精确计算将抛出该异常
  153. */
  154. privatestaticintcaculate(int[]nums,char[]operators)throwsException{
  155. intresult=0;
  156. for(inti=0;i<operators.length;i++){
  157. if(i==0){
  158. result=caculate(nums[i],nums[i+1],operators[i]);
  159. }else{
  160. result=caculate(result,nums[i+1],operators[i]);
  161. }
  162. }
  163. returnresult;
  164. }
  165. /**
  166. *根据指定操作符将两个给定的数字进行计算
  167. *
  168. *@paramnum1
  169. *数字1
  170. *@paramnum2
  171. *数字2
  172. *@paramoperator
  173. *操作符,只能从“+、-、*、/”4个操作符中取值
  174. *@return计算结果
  175. *@throwsException
  176. *当计算结果不精确时,抛出该异常,主要是针对除法运算,例如18/8=2,诸如这样不精确计算将抛出该异常
  177. */
  178. privatestaticintcaculate(intnum1,intnum2,charoperator)
  179. throwsException{
  180. doubleresult=0;
  181. switch(operator){//根据操作符做相应的计算操作
  182. case'+':
  183. result=num1+num2;
  184. break;
  185. case'-':
  186. result=num1-num2;
  187. break;
  188. case'*':
  189. result=num1*num2;
  190. break;
  191. case'/':
  192. result=(double)num1/(double)num2;
  193. break;
  194. }
  195. if(!check(result))
  196. thrownewException("不精确的计算数字");
  197. return(int)result;
  198. }
  199. /**
  200. *检查指定的浮点数是否可以直接转换为整型数字而不损失精度
  201. *
  202. *@paramresult
  203. *要检查的浮点数
  204. *@return如果可以进行无损转换,返回true,否则返回false
  205. */
  206. privatestaticbooleancheck(doubleresult){
  207. Stringstr=String.valueOf(result);
  208. intpointIndex=str.indexOf(".");//小数点的下标值
  209. Stringfraction=str.substring(pointIndex+1);
  210. returnfraction.equals("0")?true:false;//通过判断小数点后是否只有一个0来确定是否可以无损转换为整型数值
  211. }
  212. /**
  213. *对传入的整型数组buf进行全排列
  214. *
  215. *@parambuf
  216. *要进行全排列的整型数组
  217. *@paramstart
  218. *开始的下标值
  219. *@paramend
  220. *结束下标值
  221. *@paramlist
  222. *保存最后全排列结果的集合
  223. */
  224. privatestaticvoidallSort(int[]buf,intstart,intend,List<int[]>list){
  225. if(start==end){//当只要求对数组中一个字母进行全排列时,只要就按该数组输出即可
  226. int[]a=newint[buf.length];
  227. System.array(buf,0,a,0,a.length);
  228. list.add(a);
  229. }else{//多个字母全排列
  230. for(inti=start;i<=end;i++){
  231. inttemp=buf[start];//交换数组第一个元素与后续的元素
  232. buf[start]=buf[i];
  233. buf[i]=temp;
  234. allSort(buf,start+1,end,list);//后续元素递归全排列
  235. temp=buf[start];//将交换后的数组还原
  236. buf[start]=buf[i];
  237. buf[i]=temp;
  238. }
  239. }
  240. }
  241. }

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

阅读全文

与24点算法java相关的资料

热点内容
ssm身份认证源码 浏览:462
预排序遍历树算法 浏览:669
加密装置如何打开ping功能 浏览:478
python下载372 浏览:901
u盘子文件夹隐藏 浏览:296
本地误删svn文件夹 浏览:685
海康威视python通道名 浏览:241
如何用app覆盖全部曲库 浏览:602
变异布林源码 浏览:686
表格加密设置打印区域 浏览:437
卡耐基pdf下载 浏览:924
现在最流行的单片机 浏览:88
机顶盒刷机源码 浏览:985
编码pdf下载 浏览:946
隔壁同学app怎么 浏览:301
c语言宏命令 浏览:542
php卡死源码 浏览:576
time库中的clock函数python 浏览:991
cad视觉移动命令怎么打开 浏览:821
安卓java调用python 浏览:398