问题在朋友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
(#换成@)。