1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace ConsoleApp1 { 7 class Program { 8 static void Main(string[] args) { 9 10 // 防止出现随机值无法组合 11 while (ResDic.Count == 0) { 12 13 Con = 10; 14 // 初始化数组长度 15 int Len = 30; 16 Arr = new int[Len]; 17 Temp = new int[Con]; 18 19 // 最小的数 20 int Min = (Con - 1) * Con / 2; 21 // 最大的数 22 int Max = (Len - Con + 1 + Len) * Con / 2; 23 // 获取范围内的一个随机数 24 Random random = new Random(); 25 Sum = random.Next(Min, Max + 1); 26 27 // 28 GetConNum(0, 0); 29 } 30 31 Console.WriteLine(Sum); 32 Console.WriteLine(ResDic.Count); 33 34 //for (int i = 0; i < ResDic.Count; i++) { 35 // Console.WriteLine(ResDic[i]); 36 //} 37 38 Console.ReadLine(); 39 } 40 41 /// <summary> 42 /// 用于存储所有结果 43 /// </summary> 44 private static Dictionary<int, string> ResDic = new Dictionary<int, string>(); 45 /// <summary> 46 /// 用于取值 47 /// </summary> 48 private static int[] Arr; 49 /// <summary> 50 /// 用于存值 51 /// </summary> 52 private static int[] Temp; 53 /// <summary> 54 /// 要取的数字个数 55 /// </summary> 56 private static int Con; 57 /// <summary> 58 /// 总和 59 /// </summary> 60 private static int Sum; 61 62 /// <summary> 63 /// 在Arr中取Con个不重复的数字 64 /// </summary> 65 /// <param name="index"></param> 66 /// <param name="init"></param> 67 private static void GetConNum(int index, int init) { 68 69 if (index >= Con) { 70 // 计算这些数字的和 71 int Tsum = 0; 72 for (int i = 0; i < Temp.Length; i++) 73 Tsum += Temp[i]; 74 75 // 若和与Sum相同,全排列存入所有排列可能 76 if (Tsum == Sum) 77 ListArray(0); 78 79 return; 80 } 81 82 for (int i = init; i < Arr.Length; i++) { 83 Temp[index] = i; 84 GetConNum(index + 1, i + 1); 85 } 86 } 87 88 /// <summary> 89 /// 对数组Temp进行全排列 90 /// </summary> 91 /// <param name="index"></param> 92 private static void ListArray(int index) { 93 // 一次排列结束后 94 if (index >= Temp.Length) { 95 // 取出当前的排列结果,拼成字符串 96 string str = ""; 97 for (int i = 0; i < Temp.Length; i++) { 98 str += Temp[i]; 99 if (i < Temp.Length - 1) 100 str += ","; 101 } 102 // 将结果存入字典 103 ResDic.Add(ResDic.Count, str); 104 return; 105 } 106 107 int t = Temp[index]; 108 109 // 交换位置 110 for (int i = index; i < Temp.Length; i++) { 111 Temp[index] = Temp[i]; 112 Temp[i] = t; 113 ListArray(index + 1); 114 115 // 还原 116 Temp[i] = Temp[index]; 117 Temp[index] = t; 118 119 } 120 } 121 } 122 }
时间: 2024-10-10 09:50:19