static void Main(string[] args) { IntMax.StepLength = 10000; var n1 = new IntMax(-19543); var n2 = new IntMax(782); Console.WriteLine(n1 - n2); foo(); }
private static int RemoveHead0(IntMax num) { var i = num.number.Count - 1; //去除前面为0的状况 while (num.number[i] == 0 && i > 0) { i--; } return(i); }
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; }
/// <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)); }
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()); }
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); } }