批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程
[批处理文件精品]批处理版照片整理器[批处理文件精品]纯批处理备份&还原驱动在线第三方下载
返回列表 发帖

把1~9 九個數字分成三組三位數

昨天不小心看到论坛有帖子(其实也是其它地方跳过来的)
  1. http://www.bathome.net/thread-25195-1-7.html
复制代码
讲的是:把1~9 九個數字分成三組三位數(不可重复使用)要求,所有的三位数都必须是奇数,总和是 4446.  求出这个九宫格排列,顿时来了点兴趣。琢磨了一下(未看别人的方法),用PS写,同时也用 C# 写了。因PS速度不快。
分析:所有的三位数必须是奇数。那么,九宫格第三行和第三列的数字必为奇数。不重复,则 1 3 5 7 9刚好分配完。而 1+3+5+7+9=25;总和的尾数要为 6。那么 25还要再加1才行。其它的奇数与25相加都不能有尾数6。所以 第9格必定是 1。九宫格中第 1 2 4 5宫为4个偶数。
用C#写好用又爽。.Net FrameWork 4.6 致于速度,编成机器码后,都差不多。
  1. using System.Collections.Generic;
  2. using static System.Console;
  3. namespace NineSpaceSum
  4. {
  5. class NineSpace
  6. {
  7. static int[] ousu = new int[] { 2, 4, 6, 8 };
  8. static int[] jisu = new int[] { 3, 5, 7, 9 };
  9. static void Main()
  10. {
  11. List<int[]> ouPaiLei;
  12. OuSuPaiLei(ousu, out ouPaiLei);
  13. ShowResult(ouPaiLei, jisu);
  14. ReadLine();
  15. }
  16. static void OuSuPaiLei(int[] arr, out List<int[]> ouPaiLei) //偶数全排列,迭代快过递归,条件已限制所以不用递归。
  17. {
  18. ouPaiLei = new List<int[]>();
  19. for (int i = 0; i < arr.Length; i++)
  20. {
  21. for (int j = i + 1; j < arr.Length; j++)
  22. {
  23. var tmp = new List<int>();
  24. foreach (var item in arr) tmp.Add(item);
  25. tmp.Remove(arr[i]);
  26. tmp.Remove(arr[j]);
  27. ouPaiLei.Add(new int[] { arr[i], arr[j], tmp[0], tmp[1] });
  28. ouPaiLei.Add(new int[] { arr[j], arr[i], tmp[0], tmp[1] });
  29. ouPaiLei.Add(new int[] { arr[i], arr[j], tmp[1], tmp[0] });
  30. ouPaiLei.Add(new int[] { arr[j], arr[i], tmp[1], tmp[0] });
  31. }
  32. }
  33. }
  34. static void ShowResult(List<int[]> arr, int[] jisu)  //奇数全排列 并 求总和。
  35. {
  36. for (var i = 0; i < arr.Count; i++)
  37. {
  38. for (var a = 0; a < jisu.Length; a++)
  39. {
  40. var ref1 = new List<int>();
  41. foreach (var item in jisu) ref1.Add(item);
  42. ref1.Remove(jisu[a]);
  43. for(var b = 0; b < ref1.Count; b++)
  44. {
  45. var ref2 = new List<int>();
  46. foreach (var item in ref1) ref2.Add(item);
  47. ref2.Remove(ref1[b]);
  48. for(var c = 0; c < ref2.Count; c++)
  49. {
  50. var ref3 = new List<int>();
  51. foreach (var item in ref2) ref3.Add(item);
  52. ref3.Remove(ref2[c]);
  53. int 偶数和 = 200 * arr[i][0] + 110 * (arr[i][1] + arr[i][2]) + 20 * arr[i][3];
  54. int 奇数和 = 101 * (jisu[a] + ref2[c]) + 11 * (ref1[b] + ref3[0]) + 2;
  55. if(偶数和+奇数和 == 4446)
  56. {
  57. WriteLine(arr[i][0].ToString() + " " + arr[i][1].ToString() + " " + jisu[a].ToString());
  58. WriteLine(arr[i][2].ToString() + " " + arr[i][3].ToString() + " " + ref1[b].ToString());
  59. WriteLine(ref2[c].ToString() + " " + ref3[0].ToString() + " " + "1");
  60. WriteLine();
  61. }
  62. }
  63. }
  64. }
  65. }
  66. }
  67. }
  68. }
复制代码
这是已编译好的 文件 : 控制台显示[.NET FrameWork 4.6 以上]   
:)
附件: 您需要登录才可以下载或查看附件。没有帐号?注册
QQ: 458609586
脚本默认优先 [PowerShell]

设解为:
a b c
d e f
g h i
有:
a,b,d,e ∈ {2,4,6,8}
c,f,g,h,i ∈ {1,3,5,7,9}

a+b+d+e = 20
c+f+g+h+i=25

200a     +
110(b+d) +
101(c+g) +
20e      +
11(f+h)  +
2i
= 4446

199a      +
109(b+d)  +
100(c+g)  +
19e       +
10(f+h)   +
i
= 4401

(9(a+b+d+e) + i) mod 10 = 1 => i = 1


199a     +
109(b+d) +
100(c+g) +
19e      +
10(f+h)  +
=4400

上式 - 9(a+b+d+e):

190a      +
100(b+d)  +
100(c+g)  +
10e       +
10(f+h)   +
=4400-9*20=4220

100(a+b+d+c+g) + 90a + 10(e+f+h) = 4220
左右除以10:
10(a+b+d+c+g) + 9a + (e+f+h) = 422

减去八数和: a+b+d+e + c+f+g+h = 44 :
9(a+b+d+c+g) + 9a  = 422 - 44 = 378

9(20-e+c+g) + 9a  = 378
9(a+c+g-e) = 378 -180 = 198
a+c+g-e = 22
a+c+g = 22 + e
e >= 2
a+c+g >= 24
a,c,g 的平均值 >= 8, a,c,g 只能取 {7,8,9}, a 必为 8
e = a+c+g - 22 = 2,
c,g 只能取 {7,9}

b<=>d, c<=>g, f<=>h 是三组完全对称位, 完全可自由互换:
b,d 随意取 {4,6}; f,h 随意取 {3,5}; c,g 随意取 {7,9}

对称位互换, 共可得 2^3 = 8 种排列:
8 4 9
6 2 3
7 5 1

8 4 9
6 2 5
7 3 1

8 4 7
6 2 3
9 5 1

8 4 7
6 2 5
9 3 1

8 6 9
4 2 3
7 5 1

8 6 9
4 2 5
7 3 1

8 6 7
4 2 3
9 5 1

8 6 7
4 2 5
9 3 1
1

评分人数

TOP

返回列表