任意4个1-13数字,加减乘除计算24点。
实现原理:
1)排列组合4个数字
2)计算每次排列组合的可能性
Cal24.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
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<String> out = new HashSet<String>(); 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
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); } |
以上所述就是本文的全部内容了,希望大家能够喜欢。