Любые 4 числа от 1 до 13: сложите, вычтите, умножьте и разделите, чтобы получить 24 балла.
Принцип реализации:
1) Расставьте и объедините 4 числа.
2) Вычислить возможность каждой перестановки и комбинации.
Cal24.java
import java.util.HashSet;import public class Cal24 {частное статическое окончание двойной точности = 0,00001; частная статическая окончательная цель int = 24; общедоступная строка [] выполнение (строка [] входы) { int [] цифры = новый 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<String> out = new HashSet<String>(); Комбинация цифр = новая Combination() { @Override protected void handle(int[] result) { Final int[] r = result; 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) - цель) < точность || Math.abs(Math.abs(1/x) - цель) < точность) { 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(sb.append(") /n"); } return sb.toString(); } Private double doCalculate(double x, double y, int операция) { переключатель (операция) { случай 0: вернуть x + y; случай 1: вернуть x - y; случай 2: вернуть x * y; случай 3: вернуть x / y; по умолчанию: вернуть 0; } } Private static String getOperation(int Operation) { переключатель (операция) ) { случай 0: возврат "+"; случай 1: возврат "-"; случай 2: возврат "*"; случай 3: возврат "/"; } } public static void; main(String[] args) { System.out.println(new Cal24().calc(new int[]{1, 5, 5, 5}));Комбинация.java
публичный абстрактный класс Combination {частное логическое повторение; частный int total = 0; public void join(int data[]){combine(data, data.length, false); public void join(int data[], int count){ объединить (данные, счетчик, ложь); } общественного недействительными объединить (int data [], int count, логическое повторение) {this.repeat = повторение; int times = data.length; (int)Math.pow(times, count); for (int i = 0; i < size; i++) { int[] result = toArray(data, i, count); if(result != null) { handle( результат); итог ++; } } } Private int [] toArray (int data [], int i, int count) { int [] indexes = new int [count]; data.length; for (int j = 0; j < count; j++) { int temp = 0; if (i > 0) { temp = i%times; i = (i - temp)/times } indexs[j; ] = temp; } if(!repeat){ //удаляем повтор for (int x = 0; x < count; x++) { for(int y = 0; y < count; y++){ if(x != y){ if(indices[x] == indexs[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[] результат);}Выше приведено все содержание этой статьи, надеюсь, она вам всем понравится.