日期:2014-05-20  浏览次数:20688 次

散分,进行一个无聊的算法
利用 1234567890这10个数字进行加减乘除等 算术
得到 2010
例如:

2010 = 1+2-(3-4-5)*6*7*8-9+0
2010 = 12*34*5-6-7-8-9+0


要求:
1234567890这10个数字必须用到
并且每个都只能使用一次




------解决方案--------------------
想想自己也真是无聊。不带括号的解如下!

using System;
using System.Data;

namespace ConsoleApplication4
{
class Program
{
static int[] Items = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
static string[] Operators = new string[] { "+", "-", "*", "/", "" };
static DataTable Computer = new DataTable();

public static void Main(string[] args)
{
Solve(1, "1");
}

static void Solve(int currentIndex, string exp)
{
if(currentIndex == 10)
{
object value = Computer.Compute(exp, null);
if ((value is int && (int)value == 2010) || (value is double && (double)value == 2010))
Console.WriteLine("{0} = 2010", exp);
return;
}

for (int i = 0; i < 5; i++)
Solve(currentIndex + 1, exp + Operators[i] + Items[currentIndex]);
}
}
}
------解决方案--------------------
1+2*3*456-7-8*90 = 2010
1+2/3*45*67+8-9+0 = 2010
1+2/3*45*67+8-9-0 = 2010
1+2345-6*7*8+9*0 = 2010
1+2345-6*7*8-9*0 = 2010
1+2345*6/7+8-9+0 = 2010
1+2345*6/7+8-9-0 = 2010
1*2/3*45*67+8*9*0 = 2010
1*2/3*45*67+8/9*0 = 2010
1*2/3*45*67+89*0 = 2010
1*2/3*45*67-8*9*0 = 2010
1*2/3*45*67-8/9*0 = 2010
1*2/3*45*67-89*0 = 2010
1*2345*6/7+8*9*0 = 2010
1*2345*6/7+8/9*0 = 2010
1*2345*6/7+89*0 = 2010
1*2345*6/7-8*9*0 = 2010
1*2345*6/7-8/9*0 = 2010
1*2345*6/7-89*0 = 2010
1/2*3*4*5*67+8*9*0 = 2010
1/2*3*4*5*67+8/9*0 = 2010
1/2*3*4*5*67+89*0 = 2010
1/2*3*4*5*67-8*9*0 = 2010
1/2*3*4*5*67-8/9*0 = 2010
1/2*3*4*5*67-89*0 = 2010
12*34*5+6*7-8*9+0 = 2010
12*34*5+6*7-8*9-0 = 2010
12*34*5-6-7-8-9+0 = 2010
12*34*5-6-7-8-9-0 = 2010

------解决方案--------------------
嗯,以前没用过,DataTable的compute确实太慢了,所以没敢把括号加上。
换一个能算表达式的,应该能够快不少。

程序本身用的是最土的方法,没什么牛的,连雕虫小技可能都算不上吧,仅供大家娱乐了。
想快的话恐怕需要用一些类似DP的方法,或者利用波兰表达式(逆波兰也可),弄个双向搜索。

探讨
12楼的程序,我电脑跑了10几秒啊。。。

------解决方案--------------------
探讨
利用 1234567890这10个数字进行加减乘除等 算术
得到 2010
例如:

2010 = 1+2-(3-4-5)*6*7*8-9+0
2010 = 12*34*5-6-7-8-9+0


要求:
1234567890这10个数字必须用到
并且每个都只能使用一次




------解决方案--------------------
无法计算,因为不单是按顺序,无括号的
如果有括号呢?
还有不是1234567890这样的顺序呢?
排列组合太多了,普通PC无法跑
------解决方案--------------------
顶一下。有够无聊的题目

正常思路。
1,用穷举列出所有数学表达式1+2-(3-4-5)*6*7*8-9+0
2,用逆波兰求出数学表达式的值。
3,输出符合2010的数学表达式。

个人认为难的是如何穷举数学表达式,这个需要考虑的多点,情况比较复杂。
------解决方案--------------------
在穷举的基础上,貌似可以动态规划一下.
不过这题太不实际了