任意4个1-13数字,加减乘除计算24点。

实现原理:

1)排列组合4个数字

2)计算每次排列组合的可能性

Cal24.java

import java.util.HashSet;

import java.util.Set;

public class Cal24 {

private static final double precision = 0.00001;

private static final int target = 24;

public String[] execute(String[] inputs) {

int[] digits = new int[4];

for (int i = 0; i < inputs.length; i++) {

digits[i] = Integer.valueOf(inputs[i]);

}

return new String[]{calc(digits)};

}

private String calc(final int data[]){

final Set out = new HashSet();

Combination digit = new Combination() {

@Override

protected void handle(int[] result) {

final int[] r = result;

Combination oper = new Combination(){

@Override

protected void handle(int[] c) {

double x = r[0];

for (int i = 0; i < r.length - 1; i++) {

x = doCalculate(x, r[i + 1], c[i]);

}

if(Math.abs(Math.abs(x) - target) < precision || Math.abs(Math.abs(1/x) - target) < precision){

StringBuilder sb = new StringBuilder();

for (int j = 0; j < r.length; j++) {

sb.append(r[j]);

if(j != r.length - 1){

sb.append(getOperation(c[j]));

}

}

out.add(sb.toString());

}

}

};

oper.combine(new int[]{0, 1, 2, 3}, data.length - 1, true);

}

};

digit.combine(data);

StringBuilder sb = new StringBuilder();

for (String string : out) {

sb.append(string);

sb.append("\n");

}

return sb.toString();

}

private double doCalculate(double x, double y, int operation){

switch (operation) {

case 0:

return x + y;

case 1:

return x - y;

case 2:

return x * y;

case 3:

return x / y;

default:

return 0;

}

}

private static String getOperation(int operation){

switch (operation) {

case 0:

return "+";

case 1:

return "-";

case 2:

return "*";

case 3:

return "/";

default:

return "";

}

}

public static void main(String[] args) {

System.out.println(new Cal24().calc(new int[]{1, 5, 5, 5}));

}

}

Combination.java

public abstract class Combination {

private boolean repeat;

private int total = 0;

public void combine(int data[]){

combine(data, data.length, false);

}

public void combine(int data[], int count){

combine(data, count, false);

}

public void combine(int data[], int count, boolean repeat){

this.repeat = repeat;

int times = data.length;

int size = (int)Math.pow(times, count);

for (int i = 0; i < size; i++) {

int[] result = toArray(data, i, count);

if(result != null){

handle(result);

total ++;

}

}

}

private int[] toArray(int data[], int i, int count){

int [] indices = new int[count];

int times = data.length;

for (int j = 0; j < count; j++) {

int temp = 0;

if(i > 0){

temp = i%times;

i = (i - temp)/times;

}

indices[j] = temp;

}

if(!repeat){

//remove repetition

for (int x = 0; x < count; x++) {

for(int y = 0; y < count; y++){

if(x != y){

if(indices[x] == indices[y])

return null;

}

}

}

}

int [] result = new int[count];

for (int x = 0; x < count; x++) {

int selected = data[indices[x]];

result[x] = selected;

}

return result;

}

public int getTotal() {

return total;

}

protected abstract void handle(int[] result);

}

以上所述就是本文的全部内容了,希望大家能够喜欢。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐