你的位置:首页 > 软件开发 > ASP.net > 利用编程解决一道数学题

利用编程解决一道数学题

发布时间:2015-10-11 00:00:28
问题在朋友QQ空间看到一道题,如下:当时顺手画了条数轴,在数轴上标出了各个算式的解的特点:和为7的算式的解关于4对称,和为9的解关于5对称等等。草草算了下,发现很难同时满足5个条件。而细算又太麻烦,算了,反正是程序员,写程序求解吧。利用笛卡尔积求解因为是4个算式,很自然的就想到穷 ...

问题

在朋友QQ空间看到一道题,如下:

利用编程解决一道数学题

当时顺手画了条数轴,在数轴上标出了各个算式的解的特点:和为7的算式的解关于4对称,和为9的解关于5对称等等。草草算了下,发现很难同时满足5个条件。而细算又太麻烦,算了,反正是程序员,写程序求解吧。

利用笛卡尔积求解

因为是4个算式,很自然的就想到穷举法。将每个算式可能的结果放在一起算笛卡尔积,如果有解的话,则必然存在一个笛卡尔积里面存在1到8这8个不同的元素。

计算笛卡尔积的代码如下:

/// <summary>/// 计算元素集列表的笛卡尔积/// </summary>/// <typeparam name="T">元素具体类型</typeparam>/// <param name="sets">元素集列表</param>/// <returns>笛卡尔积列表</returns>public static T[][] CalculateCartesianProduct<T>(this IList<IList<T>> sets){  // 笛卡尔积总数  int total = 1;  // 元素集个数  int setCount = 0;  foreach (var set in sets)  {    total *= set.Count;    setCount++;  }  // 笛卡尔积列表  var products = new T[total][];  // 除数列表,用于计算每个笛卡尔积的情况  var dividers = new int[setCount];  int divider = 1;  // 倒序循环,因为后面的多种情况对应前面的一种情况  for (int counter = setCount - 1; counter >= 0; counter--)  {    dividers[counter] = divider;    divider *= sets[counter].Count;  }  // 计算笛卡尔积,共有permutationNumber个笛卡尔积,  // 从0到permutationNumber中,每个数字对应一种笛卡尔积情况  for (int counter = 0; counter < total; counter++)  {    // 一个笛卡尔积的情况    var permutation = new T[setCount];    int index = 0;    foreach (var set in sets)    {      // 将数字映射到元素集中的位置      var pos = (counter / dividers[index]) % set.Count;      permutation[index] = set[pos];      index++;    }    products[counter] = permutation;  }  return products;}

原标题:利用编程解决一道数学题

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录