110,538
社区成员
发帖
与我相关
我的任务
分享
internal sealed class TwentyFour
{
private int total;
private int[] data;
public TwentyFour(int total, int[] data)
{
this.total = total;
this.data = data;
}
public string Run()
{
if (data == null)
return "no data";
List<DataResult> iniData = new List<DataResult>();
for (int i = 0; i < data.Length; i++)
{
iniData.Add(new DataResult(data[i]));
}
DataResult result = GetResult(iniData);
if (result == null)
{
return "no arithmetic";
}
else
{
return result.ToString();
}
}
private DataResult GetResult(List<DataResult> arr)
{
DataResult result;
if (arr.Count == 2)
{
result = new DataResult(arr[0], arr[1], NumOpera.Add);
if (Math.Abs(result.result - total) < 0.00001)
return result;
result = new DataResult(arr[0], arr[1], NumOpera.Sub);
if (Math.Abs(result.result - total) < 0.00001)
return result;
result = new DataResult(arr[1], arr[0], NumOpera.Sub);
if (Math.Abs(result.result - total) < 0.00001)
return result;
result = new DataResult(arr[0], arr[1], NumOpera.Mul);
if (Math.Abs(result.result - total) < 0.00001)
return result;
if (arr[1].result != 0)
{
result = new DataResult(arr[0], arr[1], NumOpera.Div);
if (Math.Abs(result.result - total) < 0.00001)
return result;
}
if (arr[0].result != 0)
{
result = new DataResult(arr[1], arr[0], NumOpera.Div);
if (Math.Abs(result.result - total) < 0.00001)
return result;
}
return null;
}
List<DataResult> tempList = new List<DataResult>();
for (int i = 0; i < arr.Count; i++)
{
for (int j = i + 1; j < arr.Count; j++)
{
DataResult temp;
tempList.Clear();
for (int m = 0; m < arr.Count; m++)
{
if (m == i || m == j)
continue;
else
tempList.Add(arr[m]);
}
temp = new DataResult(arr[i], arr[j], NumOpera.Add);
tempList.Add(temp);
result = GetResult(tempList);
if (result != null)
return result;
tempList.Remove(temp);
temp = new DataResult(arr[i], arr[j], NumOpera.Sub);
tempList.Add(temp);
result = GetResult(tempList);
if (result != null)
return result;
tempList.Remove(temp);
temp = new DataResult(arr[j], arr[i], NumOpera.Sub);
tempList.Add(temp);
result = GetResult(tempList);
if (result != null)
return result;
tempList.Remove(temp);
temp = new DataResult(arr[i], arr[j], NumOpera.Mul);
tempList.Add(temp);
result = GetResult(tempList);
if (result != null)
return result;
tempList.Remove(temp);
if (arr[j].result != 0)
{
temp = new DataResult(arr[i], arr[j], NumOpera.Div);
tempList.Add(temp);
result = GetResult(tempList);
if (result != null)
return result;
tempList.Remove(temp);
}
if (arr[i].result != 0)
{
temp = new DataResult(arr[j], arr[i], NumOpera.Div);
tempList.Add(temp);
result = GetResult(tempList);
if (result != null)
return result;
tempList.Remove(temp);
}
}
}
return null;
}
}
enum NumOpera
{
Add,
Sub,
Mul,
Div
}
internal sealed class DataResult
{
public double result;
private NumOpera opt;
private DataResult data1;
private DataResult data2;
public DataResult(double da)
{
result = da;
}
public DataResult(DataResult d1, DataResult d2, NumOpera op)
{
opt = op;
data1 = d1;
data2 = d2;
switch (opt)
{
case NumOpera.Add:
result = d1.result + d2.result;
break;
case NumOpera.Div:
result = d1.result / d2.result;
break;
case NumOpera.Mul:
result = d1.result * d2.result;
break;
case NumOpera.Sub:
result = d1.result - d2.result;
break;
}
}
public override string ToString()
{
if (data1 != null && data2 != null)
{
switch (opt)
{
case NumOpera.Add:
return "(" + data1.ToString() + "+" + data2.ToString() + ")";
case NumOpera.Div:
return "(" + data1.ToString() + "/" + data2.ToString() + ")";
case NumOpera.Mul:
return "(" + data1.ToString() + "*" + data2.ToString() + ")";
case NumOpera.Sub:
return "(" + data1.ToString() + "-" + data2.ToString() + ")";
}
}
return result.ToString();
}
}