1 /// <summary> 2 /// 序列号产生器(用闭包实现)。 3 /// </summary> 4 /// <returns></returns> 5 public static Func<string> SerialMaker(string prefix, int sequence) 6 { 7 Func<string> maker = delegate 8 { 9 var result = prefix + sequence.ToString(); 10 sequence++; 11 return result; 12 }; 13 return maker; 14 } 15 16 /// <summary> 17 /// 序列号产生器(用闭包实现)。 18 /// </summary> 19 /// <returns></returns> 20 public static Func<string> SerialMaker(string prefix, decimal sequence) 21 { 22 Func<string> maker = () => 23 { 24 var result = prefix + sequence.ToString(CultureInfo.InvariantCulture); 25 sequence++; 26 return result; 27 }; 28 return maker; 29 } 30 31 /// <summary> 32 /// 阶乘。 33 /// </summary> 34 /// <param name="i"></param> 35 /// <param name="a"></param> 36 /// <returns></returns> 37 public static int Factorial(int i, int a = 1) 38 { 39 if (i < 2) 40 { 41 return a; 42 } 43 return Factorial(i - 1, a * i); 44 } 45 46 /// <summary> 47 /// 阶乘。 48 /// </summary> 49 /// <param name="n"></param> 50 /// <returns></returns> 51 public static int Factorial(int n) 52 { 53 return n < 2 ? 1 : n * Factorial(n - 1); 54 } 55 56 /// <summary> 57 /// 汉诺塔。 58 /// </summary> 59 /// <param name="disc">圆盘个数。</param> 60 /// <param name="src">源柱子。</param> 61 /// <param name="aux">辅助柱子。</param> 62 /// <param name="dst">目标柱子。</param> 63 public static void Hanoi(int disc, string src, string aux, string dst) 64 { 65 if (disc > 0) 66 { 67 Hanoi(disc - 1, src, dst, aux); 68 Console.WriteLine("Move disc {0} from {1} to {2}", 69 disc, src, dst); 70 Hanoi(disc - 1, aux, src, dst); 71 } 72 } 73 74 /// <summary> 75 /// 自动解析字节单位。 76 /// </summary> 77 /// <param name="size">字节大小。</param> 78 /// <returns>返回带单位的字节大小字符串。</returns> 79 public static string ParseUnitOfByte(long size) 80 { 81 const int GB = 1024 * 1024 * 1024; 82 const int MB = 1024 * 1024; 83 const int KB = 1024; 84 if (size / (float)GB >= 0.6) 85 { 86 return string.Format("{0} GB", Math.Round(size / (float)GB, 2)); 87 } 88 else if (size / (float)MB >= 0.6) 89 { 90 return string.Format("{0} MB", Math.Round(size / (float)MB, 2)); 91 } 92 else if (size / (float)KB >= 0.6) 93 { 94 return string.Format("{0} KB", Math.Round(size / (float)KB, 2)); 95 } 96 else 97 { 98 return string.Format("{0} Byte", size); 99 } 100 } 101 102 /// <summary> 103 /// 计算斐波纳契(Fibonacci)数列(最前面的两个数字是0和1)。 104 /// </summary> 105 /// <returns></returns> 106 public static Func<int, int> Fibonacci() 107 { 108 List<int> memory = new List<int> { 0, 1 }; 109 return n => { return Fib(n, memory); }; 110 } 111 112 /// <summary> 113 /// 利用递归函数计算斐波纳契(Fibonacci)数列,并用记忆技术优化递归过程。 114 /// </summary> 115 /// <param name="n">第n项</param> 116 /// <param name="memory">缓存</param> 117 /// <returns></returns> 118 private static int Fib(int n, List<int> memory) 119 { 120 int result; 121 if (n < memory.Count) 122 { 123 result = memory[n]; 124 } 125 else 126 { 127 result = Fib(n - 1, memory) + Fib(n - 2, memory); 128 memory.Add(result); 129 } 130 return result; 131 } 132 133 /// <summary> 134 /// 计算斐波纳契(Fibonacci)数列(最前面的两个数字是0和1)。 135 /// </summary> 136 /// <param name="n">第n项</param> 137 /// <returns></returns> 138 public static decimal Fibonacci(int n) 139 { 140 return n < 2 ? n : Fibonacci(n - 1) + Fibonacci(n - 2); 141 } 142 143 /// <summary> 144 /// 查找水仙花数(水仙花数是一个三位数,其中每一位数的立方之和等于这个三位数本身)。 145 /// </summary> 146 /// <returns></returns> 147 public static IEnumerable<int> FindDaffodils() 148 { 149 var list = new List<int>(); 150 int x, y, z; 151 for (int i = 100; i <= 999; i++) 152 { 153 x = Math.DivRem(i, 100, out y); 154 y = Math.DivRem(y, 10, out z); 155 x = (int)Math.Pow(x, 3); 156 y = y * y * y; 157 z = (int)Math.Pow(z, 3); 158 if (x + y + z == i) 159 { 160 list.Add(i); 161 } 162 } 163 return list; 164 } 165 166 /// <summary> 167 /// 韩信点兵算法(韩信带兵不足百人,3人一行排列多一人,7人一行排列少2人,5人一行排列正好。 168 /// 请问韩信究竟带了多少兵?)。 169 /// </summary> 170 /// <returns></returns> 171 public static IEnumerable<int> HanxinDianBing() 172 { 173 var list = new List<int>(); 174 int x, y, z; 175 for (int i = 1; i < 100; i++) 176 { 177 Math.DivRem(i, 3, out x); 178 Math.DivRem(i, 7, out y); 179 Math.DivRem(i, 5, out z); 180 if (x==1&&y==5&&z==0) 181 { 182 list.Add(i); 183 } 184 } 185 return list; 186 } 187 188 /// <summary> 189 /// 百钱百鸡算法(如何用100元钱买100只鸡,其中公鸡5元一只,母鸡3元一只,小鸡3只一元。)。 190 /// </summary> 191 /// <returns></returns> 192 public static IEnumerable<HundredChicken> CalculateHundredMoneyHundredChicken() 193 { 194 int i, j, c, r; 195 var list = new List<HundredChicken>(); 196 for (i = 1; i < 20; i++) 197 { 198 for (j = 1; j < 32; j++) 199 { 200 c = 100 - i - j; 201 Math.DivRem(c, 3, out r); 202 if (r == 0 && (5 * i + 3 * j + c / 3) == 100) 203 { 204 list.Add(new HundredChicken { Cock = i, Hen = j, Chicken = c }); 205 } 206 } 207 } 208 return list; 209 } 210 211 /// <summary> 212 /// 鸡 213 /// </summary> 214 public class HundredChicken 215 { 216 /// <summary> 217 /// 公鸡 218 /// </summary> 219 public int Cock { get; set; } 220 221 /// <summary> 222 /// 母鸡 223 /// </summary> 224 public int Hen { get; set; } 225 226 /// <summary> 227 /// 小鸡 228 /// </summary> 229 public int Chicken { get; set; } 230 } 231 232 /// <summary> 233 /// 冒泡排序(升级版)。 234 /// </summary> 235 /// <param name="data">数列</param> 236 public static void BubbleSortPlus(int[] data) 237 { 238 int temp, i = 0; 239 bool done = false; 240 while (i < data.Length - 1 && !done) 241 { 242 done = true; 243 for (int j = 0; j < data.Length - 1 - i; j++) 244 { 245 if (data[j] > data[j + 1]) 246 { 247 done = false; 248 temp = data[j]; 249 data[j] = data[j + 1]; 250 data[j + 1] = temp; 251 } 252 } 253 i++; 254 } 255 } 256 257 /// <summary> 258 /// 冒泡排序。 259 /// </summary> 260 /// <param name="data">数列</param> 261 public static void BubbleSort(int[] data) 262 { 263 int temp; 264 for (int i = 0; i < data.Length - 1; i++) 265 { 266 for (int j = 0; j < data.Length - 1 - i; j++) 267 { 268 if (data[j] > data[j + 1]) 269 { 270 temp = data[j]; 271 data[j] = data[j + 1]; 272 data[j + 1] = temp; 273 } 274 } 275 } 276 } 277 278 /// <summary> 279 /// 选择排序。 280 /// </summary> 281 /// <param name="data">数列</param> 282 public static void SelectionSort(int[] data) 283 { 284 int min,temp; 285 for (int i = 0; i < data.Length-1; i++) 286 { 287 min = i; 288 for (int j = i+1; j < data.Length; j++) 289 { 290 if (data[j]<data[min]) 291 { 292 min = j; 293 } 294 } 295 temp = data[min]; 296 data[min] = data[i]; 297 data[i] = temp; 298 } 299 } 300 301 /// <summary> 302 /// 直接插入排序(对于“基本有序”的较小的数列效率较高)。 303 /// </summary> 304 /// <param name="data">数列</param> 305 public static void InsertionSort(int[] data) 306 { 307 int j,temp; 308 for (int i = 1; i < data.Length; i++) 309 { 310 temp = data[i]; 311 j = i; 312 while (j>0&&data[j-1]>temp) 313 { 314 data[j] = data[j - 1]; 315 j--; 316 } 317 data[j] = temp; //if(j!=i) data[j] = temp; 318 } 319 }