Esempio n. 1
0
        static void Main(string[] args)
        {
            IntMax.StepLength = 10000;
            var n1 = new IntMax(-19543);
            var n2 = new IntMax(782);

            Console.WriteLine(n1 - n2);
            foo();
        }
Esempio n. 2
0
        private static int RemoveHead0(IntMax num)
        {
            var i = num.number.Count - 1;

            //去除前面为0的状况
            while (num.number[i] == 0 && i > 0)
            {
                i--;
            }
            return(i);
        }
Esempio n. 3
0
        public IntMax(bool isMinus, List <int> num)
        {
            var i = IntMax.RemoveHead0(num);

            for (int k = 0; k <= i; k++)
            {
                this.number.Add(num[k]);
            }

            this.IsMinus = isMinus;
        }
Esempio n. 4
0
        /// <summary>
        /// 减法
        /// </summary>
        /// <param name="num1"></param>
        /// <param name="num2"></param>
        /// <returns></returns>
        public static IntMax operator -(IntMax num1, IntMax num2)
        {
            if (num2.IsMinus)
            {
                return(num1 + (-num2));
            }
            if (num1 < num2)
            {
                var r = num2 - num1;
                return(-r);
            }

            if (num1.IsMinus)
            {
                if (num2.IsMinus == false)
                {
                    var r = new IntMax(num1.number) + num2;
                    r.IsMinus = true;
                    return(r);
                }
                else
                {
                    return(new IntMax(num2.number) + num1);
                }
            }
            if (num2.IsMinus)
            {
                return(num1 + (-num2));
            }

            var list = new List <int>();

            for (int i = 0; i < num2.number.Count; i++)
            {
                list.Add(num1.number[i] - num2.number[i]);
            }
            for (int i = num2.number.Count; i < num1.number.Count; i++)
            {
                list.Add(num1.number[i]);
            }
            for (int i = 0; i < list.Count; i++)
            {
                if (list[i] < 0)
                {
                    list[i]     = list[i] + IntMax.StepLength;
                    list[i + 1] = list[i + 1] - 1;
                }
            }
            return(new IntMax(list));
        }
Esempio n. 5
0
        public override string ToString()
        {
            var sb = new StringBuilder();

            if (this.IsMinus)
            {
                sb.Append("-");
            }

            var i = IntMax.RemoveHead0(this);

            //首位不需要用0补齐
            sb.Append(this.number[i].ToString());
            i--;
            //拼接数字
            for (; i >= 0; i--)
            {
                sb.Append(this.number[i].ToString(IntMax.StepLength.ToString().Substring(1)));
            }
            return(sb.ToString());
        }
Esempio n. 6
0
        static void foo()
        {
            var random = new Random();
            var sw     = new Stopwatch();

            while (true)
            {
                var r   = new IntMax();
                var res = 0l;
                sw.Restart();
                for (int k = 0; k < 1000000; k++)
                {
                    var num = k;//random.Next(1, 100000000);
                    r = r - num;
                }
                sw.Stop();
                var time1 = sw.ElapsedMilliseconds;
                sw.Restart();
                for (int k = 0; k < 1000000; k++)
                {
                    var num = k;//random.Next(1, 100000000);
                    if (k % 2 == 0)
                    {
                        res = res + num;
                    }
                    else
                    {
                        res = res - num;
                    }
                }
                sw.Stop();
                var time2 = sw.ElapsedMilliseconds;
                Console.WriteLine($"Result: {res == r} Long: {res} IntMax: {r} Time1: {time1 / 1000.0} Time2: {time2 / 1000.0}");
                Thread.Sleep(1);
            }
        }