逻辑算法题,数学逻辑强的来,够胆你就来,等你来约!!!

LanFavourite 2015-11-30 05:15:11
加精
现在有这么个需求:我需要这么一个方法,我会往这个方法里头传入四个 int 类型的参数,
即: int a, int b, int c, int d
例如:我传进来的四个int 数是:1, 4,4, 3 现在需要将传入的这四个整型的参数进行 加减乘除 法则运算!

但是现如今的问题是:你不能确定第一个数与第二个数用的是什么运算符连接,同理,第二个数与第三个数也不能确定用什么运算符号连接,第三个数与第四个数也是一样的道理!即:数与数之间连接起来的运算符(+、—、x、÷) 不能确定是用什么运算符连接起来,这就意味着我们在程序当中需要去进行一一罗列!再者,有可能这四个数连接起来用的全部是加法,也有可能全部是减法,有可能只用了其中两种,也有可能只用了运算符的其中三种,也可能四种全部用上了!

最后将运算得到的结果进行筛选,结果大于16的,全部过滤掉,pass掉,只留下小于等于16的结果,0 也可以过滤掉了,没有意义,并将结果进行从小到大排序打印出来!(当然,重复的结果留下其中一个就够了)!

有谁会写这道算法题,赐教!!! 分可以再加100!
...全文
5068 70 打赏 收藏 转发到动态 举报
写回复
用AI写文章
70 条回复
切换为时间正序
请发表友善的回复…
发表回复
w_lbj 2018-04-24
  • 打赏
  • 举报
回复
//加减乘数,不限制计算位数(0除外) public static void main(String[] args) { List<String> t = new ArrayList<>(); t.add("+"); t.add("-"); t.add("*"); t.add("/"); Integer[] ints = { 1, 2, 3, 21, 12, 7, 11,12,13 }; List<String> allF = new ArrayList<>(); allF = I_Array(t, ints, allF, 0); Set<Double> set = new HashSet<>(); for (int i = 0; i < allF.size(); i++) { Double d = A_T_R(allF.get(i)); if (d < 16) { set.add(d); } } List<Double> list = new ArrayList<>(); list.addAll(set); Collections.sort(list); System.out.println(list.toString()); System.gc(); } private static List<String> I_Array(List<String> t, Integer[] ints, List<String> allF, Integer index) { if (index == 0) { allF.add("" + ints[index++]); } if (index == ints.length || ints.length == 1) { return allF; } List<String> list = new ArrayList<>(); list.addAll(allF); allF.clear(); List<String> each = null; for (int i = 0; i < list.size(); i++) { each = new ArrayList<>(); for (int j = 0; j < t.size(); j++) { each.add(list.get(i) + t.get(j) + ints[index]); } allF.addAll(each); } return I_Array(t, ints, allF, ++index); } private static Double A_T_R(String str) { int l = str.length(); Double r = 0.0; if (str.indexOf("+") != -1) { String[] adds = str.split("\\+"); for (int i = 0; i < adds.length; i++) { Double t = 0.0; if (adds[i].indexOf("-") != -1) { String[] tracks = adds[i].split("-"); t = M_D_R(tracks[0]); for (int j = 1; j < tracks.length; j++) { t -= M_D_R(tracks[j]); } r += t; } else { r += M_D_R(adds[i]); } } } else if (str.indexOf("-") != -1) { String[] tracks = str.split("-"); r = M_D_R(tracks[0]); for (int j = 1; j < tracks.length; j++) { r -= M_D_R(tracks[j]); } } else { r = M_D_R(str); } return r; } private static Double M_D_R(String str) { int b = str.indexOf("/") == str.indexOf("*") ? str.length() : (str.indexOf("/") > str.indexOf("*") && str.indexOf("*") != -1 ? str.indexOf("*") : (str.indexOf("/") != -1 ? str.indexOf("/") : str.indexOf("*"))); Double r = Double.valueOf(str.substring(0, b)); for (int i = b + 1; i < str.length(); i++) { int e = str.indexOf("/", i) == str.indexOf("*", i) ? str.length() : (str.indexOf("/", i) > str.indexOf("*", i) && str.indexOf("*", i) != -1 ? str.indexOf("*", i) : (str.indexOf("/", i) != -1 ? str.indexOf("/", i) : str.indexOf("*", i))); if (str.substring(i - 1, i).equals("/")) { r = r / Double.valueOf(str.substring(i, e)); } else { r = r * Double.valueOf(str.substring(i, e)); } i = e; } return r; }
qq_36522587 2018-04-04
  • 打赏
  • 举报
回复
要考虑优先级吧还要
海贼小D 2017-02-07
  • 打赏
  • 举报
回复
引用 20 楼 a291263379 的回复:
拿去玩吧

public static void main(String[] args) {
		 
		 Set<Integer> set = new HashSet<Integer>();
			for (int i = 0; i < 4; i++) {
				for (int j = 0; j < 4; j++) {
					for (int k = 0; k < 4; k++) {
						List<Integer> listnum = new ArrayList<Integer>();
						//四个整形数字listnum
						//四个整形数字之间的三种运算 0代表加 1代表减 2乘3除
						listnum.add(1);
						listnum.add(2);
						listnum.add(2);
						listnum.add(1);
						int m =myMethod(i,j,k,listnum);
							if( m <= 16){
								set.add(m);
							}
					}
				}
			}
			List<Integer> list = new ArrayList<Integer>();
			list.addAll(set);
			Collections.sort(list);
			System.out.println(list);
	 }

	private static int myMethod(int i, int j, int k,List<Integer> listnum) {
		List<Integer> list = new ArrayList<Integer>();
		list.add(i);
		list.add(j);
		list.add(k);
		
		while(list.contains(2) || list.contains(3)){
			//合并乘除,一次只去除一个乘号或者除号
			for (int m = 0; m < list.size(); m++) {
				if(list.get(m) == 2 || list.get(m) == 3){
					try {//如果被除数是0可能会报错,直接跳过
						listnum.set(m, list.get(m) == 2 ? listnum.get(m)*listnum.get(m+1) : listnum.get(m)/listnum.get(m+1));
					} catch (Exception e) {
						break;
					}
					listnum.remove(m+1);
					list.remove(m);
					break;
				}
			}
		}
		//合并加减
		while(list != null && list.size() > 0){
					listnum.set(0, list.get(0) == 0 ? listnum.get(0)+listnum.get(1) : listnum.get(0)-listnum.get(1));
					listnum.remove(1);
					list.remove(0);
		}
		return listnum.get(0);
	}


三个循环用随机数最好吧,不然结果是一成不变的
a9805943 2016-02-23
  • 打赏
  • 举报
回复
4的四次方256个结果
星际之痕 2015-12-16
  • 打赏
  • 举报
回复
引用 45楼我是你的主体 的回复:
引用 41 楼 cs_cef 的回复:
穷举排列组合都是4的3次方, 不过33楼元素个数是固定的,把穷举抽离出来可以支持任意元素个数跟变化种类.EAM方法可以用在任何需要排列组合的程序里面. [quote=引用 40 楼 Violet_yang 的回复:] 不错,但是既然也用到了ScriptEngine,#33楼的写法更加简洁易懂。性能方面不好说,但是应该差距不大。
哥们,你运行的结果和33楼结果有差距,33楼结果没有16[/quote]边界值没加等号罢了,对程序有影响吗?主要是看思路和设计!
a312637477 2015-12-14
  • 打赏
  • 举报
回复
java不知道,c#一行就搞定了
qingnlo 2015-12-14
  • 打赏
  • 举报
回复
进来观望一下~
老班长涛哥 2015-12-11
  • 打赏
  • 举报
回复
感觉像背包问题
魅力橙香灬 2015-12-09
  • 打赏
  • 举报
回复
咋全用java写啊?我看不懂啊
BLACK_MUSIC 2015-12-09
  • 打赏
  • 举报
回复
引用 21 楼 nfsnyy007 的回复:
感觉不难啊。四个数字n1 n2 n3 n4 第一步n1 和n2运算 4种结果记做r1 第二步 r1和n3运算 4种结果 记做r2 第四步 r2和n4运算 4种结果 最终结果r 然后处理r 去掉不合格的 排序不就行了。。。 有时间实现一下 = = ps:数字放一起 运算放一起 结果放一起就行了
加减能先于乘除运算吗
JanWarlen 2015-12-08
  • 打赏
  • 举报
回复
四重for循环暴力破解 for(+) for(-) for(*) for(/)
  • 打赏
  • 举报
回复
qq_33266383 2015-12-05
  • 打赏
  • 举报
回复
不造
sinat_31535993 2015-12-03
  • 打赏
  • 举报
回复
引用 54 楼 Mars13889146832 的回复:
天哪噜,难道就没有考虑四则运算优先级的吗?一个个的就直接循环上了,好吓人。
对于穷举来说,运算优先级就相当于换了一下顺序,是不影响结果的
sinat_31535993 2015-12-03
  • 打赏
  • 举报
回复
这个就相当于7位数字的排列组合,类似1-1-1-1,一共4*4*3*4*2*4*1种可能,分别取两个数组,存放数字和运算符的排列顺序,然后取值按顺序拼接就行了。 还有遇到/0抛个异常就行了,反正这个情况不满足条件。 最后提一点,INT类型的值是除不出来小数的。
bootstream 2015-12-03
  • 打赏
  • 举报
回复
天哪噜,难道就没有考虑四则运算优先级的吗?一个个的就直接循环上了,好吓人。
wang2046783134 2015-12-03
  • 打赏
  • 举报
回复
学习了
hughpansh 2015-12-03
  • 打赏
  • 举报
回复
a,b,c,d,共4个数;1,2,3,4,分别代表+-×÷。第一步:abcd进行排列;第二步:1,2,3,4进行全排列,e.g.,111,112,113,121,122,123,......;第三步:abcd的排列和123的全排列合在一起;第四步:根据计算结果舍弃,余下结果排序,并给出相应表达式,相同结果的只留下一种即可。楼主,这样行吗?
weixin_33101279 2015-12-02
  • 打赏
  • 举报
回复
引用 6楼codingMozart 的回复:
四个数怎么用到四个运算符的
他的意思是总共四种运算符,随机分配在三个空里面
cs_cef 2015-12-02
  • 打赏
  • 举报
回复
穷举排列组合都是4的3次方, 不过33楼元素个数是固定的,把穷举抽离出来可以支持任意元素个数跟变化种类.EAM方法可以用在任何需要排列组合的程序里面.
引用 40 楼 Violet_yang 的回复:
不错,但是既然也用到了ScriptEngine,#33楼的写法更加简洁易懂。性能方面不好说,但是应该差距不大。
加载更多回复(48)

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧