任意四个数得到24点,可以将其表现为如下两种公式表示
( (a?b) ? c ) ? d ( a?b ) ? ( c?d )
假设三个 ?号的符号已经确定,只要将所给的四个数字放入到两个公式中然后计算是否等于24;
到这一步关键就是怎么将四个数字放进去,可以用穷举法,将每一种情况列出来,也可以,通过算法,将四个数字按照一定规则排序然后得到特定序列,然后进行循环输入一个编号然后得到特定的序列,将这个特定序列的一串数字放入公式中。
代码如下
/*
* 参数一任意长度数组,参数二该数组长度n!-1之间的数设为count;
* 该数组有n!中排布方式,输入count可得到一个独一无二的排序方式的数组。
*/
public static void getNum(int b[],int count) {
int n = b.length;
int a [] = new int [n];
for(int i = 0;i<n;i++) {
a[i] = b[i];
}
int result[] = new int [n];
result [n - 1] = count;
for(int i = 1;i<n;i++) {
if(result[n - i] <= n - i + 1) {
result[n - i -1] = 1;
}else {
if( result[n - i] % (n - i + 1) == 0) {
// System.out.println(n-i+1+"***整除" + result[n - i]);
result [n -i -1] = result[n - i] / (n -i + 1);
}
else{
// System.out.println(n-i+1+"***");
result [n -i -1] = result[n - i] / (n -i +1) + 1;
}
}
}
// print(result);
for(int i = 0;i<n;i++) {
if( result[n - i -1] <= n - i)
result[n - i -1] = result[n - i -1];
else {
result[n - i - 1] = result[n-i-1] - (result[n-i-2]-1) * (n-i);
}
}
// print(result);
int temp = 0;
for(int i = 0;i<n ;i++) {
if(result[i] == 1) {
// System.out.println("nochange");
}else {
temp = a[result[i] - 2];
a[result[i] - 2] = a[i];
a[i] = temp;
// System.out.print("change:");
// print(a);
}
}
print(a);
return ;
}
然后就是符号的排序,符号也可以给出一个长度为3的数组(因为没有考虑周全代码中的数组长度为4,但是并不影响输出),
每个符号都有4种可能,所以总共有4*4*4种可能性,可以建造一个类这个类中有两个方法,两个数据,第一个方法就是设置这两个数据值,另一个方法是,输入(0-3)之间的一个数然后就可以得到这个数字对应的运算结果,例如输入 0 就可以 两个数据相加的结果。
还是穷举法使用符号的排序,可以设置一个方法,输入一个编号就可以返回一个数组 例如 000 然后将这个数组放进建造的类中,那么就可以将这个000转化为+++,然后用这个+++和刚才所说的独一无二的数组进行运算 看看是否等于24。
整体思路就是这样,剩下的就是关于怎么排序得到独一无二的数组和得到符号,可以在我的代码中寻找。
package game;
import java.util.Scanner;
class Calculate
{
double a,b;
public void setValue(double a,double b)
{
this.a = a;
this.b = b;
}
public double getValue(int i)
{
// System.out.println(i);
switch(i)
{
case 0:return a+b;
case 1:return a-b;
case 2:return a*b;
default:return a/b;
}
}
}
public class Game_24 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
double num[] = new double [4];
for(int i = 0;i<4;i++)
{
System.out.println("输入第"+(i+1)+"个数据");
num[i] = sc.nextDouble();
}
getResult(num);
sc.close();
}
public static boolean getResult(double num[]) {
boolean flag = false;
double temp[] = new double [4];//数字排序
int number[] = new int [4];//符号排序
Calculate ca = new Calculate();
double sum = 0;
double sum2 = 0;
for(int i = 1;i<= 24;i++)
{
temp = getNum(num,i);
for(int j = 1;j<=256;j++)
{
number = getNum1(j);
//方案一
sum = 0;
for(int k = 0;k<4;k++)
{
ca.setValue(sum, temp[k]);
sum = ca.getValue(number[k]);
}
if(sum >= 23.9&&sum<=24.1) {
System.out.println("成功"+sum);
print(temp);
System.out.println("第一种((a?b)?c)?d");
print1(number);
// return true;
}
//方案二
sum = 0;sum2 = 0;
for(int k = 0;k<2;k++)
{
ca.setValue(sum, temp[k]);
sum = ca.getValue(number[k]);
}
ca.setValue(temp[2], temp[3]);
sum2 = ca.getValue(number[3]);
ca.setValue(sum, sum2);
sum = ca.getValue(number[2]);
if(sum >= 23.9&&sum<=24.1) {
System.out.println("成功"+sum);
print(temp);
System.out.println("第二种:(a?b)?(c?d):");
print1(number);
// return true;
}
//方案三
sum = 0;
for(int k = 0;k<4;k++)
{
ca.setValue(temp[k], sum);
sum = ca.getValue(number[k]);
}
if(sum >= 23.9&&sum<=24.1) {
System.out.println("成功"+sum);
print2(number,temp);
// return true;
}
//结束判断,进入下一轮判断
}
}
return flag;
}
public static double[] getNum(double a[],int count)
{
int n = a.length;
int result[] = new int [n];
result [n - 1] = count;
for(int i = 1;i<n;i++) {
if(result[n - i] <= n - i + 1) {
result[n - i -1] = 1;
}else {
if( result[n - i] % (n - i + 1) == 0) {
// System.out.println(n-i+1+"***整除" + result[n - i]);
result [n -i -1] = result[n - i] / (n -i + 1);
}
else{
// System.out.println(n-i+1+"***");
result [n -i -1] = result[n - i] / (n -i +1) + 1;
}
}
}
// print(result);
for(int i = 0;i<n;i++) {
if( result[n - i -1] <= n - i)
result[n - i -1] = result[n - i -1];
else {
result[n - i - 1] = result[n-i-1] - (result[n-i-2]-1) * (n-i);
}
}
// print(result);
double temp = 0;
for(int i = 0;i<n ;i++) {
if(result[i] == 1) {
// System.out.println("nochange");
}else {
temp = a[result[i] - 2];
a[result[i] - 2] = a[i];
a[i] = temp;
// System.out.print("change:");
// print(a);
}
}
return a;
}
public static int [] getNum1(int count)
{
int result[] = new int [4];
int i = 0;
while(i < 4) {
result[i] = count % 4;
count /= 4;
// System.out.println(result[i]);
i++;
}
result[0] = 0;
// print(result);
return result;
}
public static void print(double a[])
{
for(int i = 0;i<a.length;i++)
System.out.print((int)a[i] + " ");
System.out.println();
}
public static void print1(int a[])
{
String str = "+-*/";
for(int i = 1;i<a.length;i++)
System.out.print( str.charAt(a[i]) + " ");
System.out.println();
System.out.println();
}
public static void print2(int number[],double temp[]) {
print(temp);
String str = "+-*/";
System.out.println(""+(int)temp[3]+str.charAt(number[3])+"("+(int)temp[2]+str.charAt(number[2])+"("+(int)temp[1]+str.charAt(number[1])+(int)temp[0]+"))" );
}
}