示例#1
0
 public static void Course1()
 {
     {   // Week 1
         var a  = new DivideAndConquer.Karatsuba("3141592653589793238462643383279502884197169399375105820974944592");
         var b  = new DivideAndConquer.Karatsuba("2718281828459045235360287471352662497757247093699959574966967627");
         var ab = String.Join("", (a * b));
         // 8539734222673567065463550869546574495034888535765114961879601127067743044893204848617875072216249073013374895871952806582723184
     }
     {   // Week 2
         var data       = Array.ConvertAll(File.ReadAllLines(@"..\..\IntegerArray.txt"), int.Parse);
         var inversions = DivideAndConquer.Inversion.Count(data);
         // 2407905288
     }
     {   // Week 3
         var data      = Array.ConvertAll(File.ReadAllLines(@"..\..\QuickSort.txt"), int.Parse);
         var d1        = (int[])data.Clone();
         var d2        = (int[])data.Clone();
         var d3        = (int[])data.Clone();
         var firstCMP  = DivideAndConquer.QuickSort.Sort(ref d1, DivideAndConquer.Option.FIRST);
         var finalCMP  = DivideAndConquer.QuickSort.Sort(ref d2, DivideAndConquer.Option.FINAL);
         var medianCMP = DivideAndConquer.QuickSort.Sort(ref d3, DivideAndConquer.Option.MEDIAN);
         // 162085
         // 164123
         // 138382
     }
     {   // Week 4
         var data   = File.ReadAllLines(@"..\..\kargerMinCut.txt").Select(n => new List <int>(Array.ConvertAll(n.Split(new char[0], StringSplitOptions.RemoveEmptyEntries), int.Parse))).ToList();
         var result = DivideAndConquer.Krager.Compute(ref data);
         // 17
     }
 }
示例#2
0
        public static Karatsuba operator *(Karatsuba A, Karatsuba B)
        {
            if (A.Count == 1)
            {
                return(new Karatsuba((A[0] * B[0]).ToString()));
            }

            var n = Math.Max(A.Count, B.Count) >> 1;
            var a = new Karatsuba(A.GetRange(0, n));
            var b = new Karatsuba(A.GetRange(n, Math.Max(1, n)));
            var c = new Karatsuba(B.GetRange(0, n));
            var d = new Karatsuba(B.GetRange(n, Math.Max(1, n)));

            return(((a * c) << (n << 1)) + ((a * d) << n) + ((b * c) << n) + (b * d));
        }