"速算24"算法思路

给定任意4个自然数,请给出通过4则运算,使结果为24的算法,并且每个数在算式中使用一次。如果无法通过上述规则得到24,则输出“无法计算得到24”。
如果给出4个数为2、3、4、5,程序的输出结果应是一个表达式:(5+3-2)*4
如果给出的4个数是1、1、1、1,程序的输出结果应该是:无法计算得到24

要求:提交算法思路即可。


思路:
    琢磨了好长时间没想到什么好的算法,只能用穷举了,先分析一下穷举包含多少种情况:
     1、操作数。由于是给定的4个数,所以把这个4个数进行全排列,共有:24种
     2、运算符。4个数之间有3个运算符,每个运算符有4种选择,共有:64种
     3、运算符优先级。共有:5种
    统计上面的情况,应该总共有:24*64*5=7680种
    即如果用a、b、c、d代表这四个数,&代表某一种运算符,优先级依然用括号表示,那么只需要分别考虑以下这些形式:
     1、(a & b) & (c & d)
 2、((a & b) & c) & d
 3、(a & (b & c)) & d
 4、a & (b & (c & d))
 5、a & ((b & c) & d)
实现:
    一、定义一个方法完成两个数之间的四则运算
 
 int calculate(int x,int y,char flag) //其中x,y为两个操作数,flag表示要进行哪一种四则运算,方法返回两个操作数运算结果

    二、定义一个方法完成上述五种运算形式

 String dealWithLevel(int []number){   //number数组为rankNumber(int [] originalNumber)方法传入的操作数排列
  int res1,res2,res3  //定义3个变量来存放两两操作数之间的运算结果
  char []flag = {"+","-","*","/"}  //定义运算符数组

  //循环完成第一种形式(a & b) & (c & d)
  for(int i = 0;i<flag.length();i++){   
   res1= calculate(number[0],number[1],flag[i]);
   for(int j = 0;j<flag.length();j++){
    res2 = calculate(number[2],number[3],flag[j]);
    for(int k = 0;k<flag.length();k++){
     res3 = calculate(res1,res2,flag[k]);
     if(res3==24){
      //找到结果并返回结果表达式
     }
    }
   }
 
  }   
  //其它四种省略
  //如果没有找到结果,返回无法计算得到24
 }

     三、定义一个方法给4个给定的数做全排列
 
 String rankNumber(int [] originalNumber){
  //将接收到的原始数据做全排列,每得到一个全排列调用一次dealWithLevel(number)方法;  
 }

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值