"Учу" длинную арифметику - C#
Формулировка задачи:
Доброго времени суток. Начал пробывать реализовывать длинную арифметику на шарпе, но вышло очень криво, соответственно очень долго(это слабо сказанно). Подскажите как можно оптимизировать. Прошу не писать что-то вроде "Пиши на плюсах" и др. Интересует только шарп.
Сумма
Вычитание
Умножение
Умножение одного символа на число
Заранее благодарю.
private static string Sum(string F, string S) { string result=""; if ((F[0] == '-') && (S[0] != '-')) return Minus(S, F.Remove(0,1)); if ((F[0] != '-') && (S[0] == '-')) return Minus(F, S.Remove(0,1)); bool minus = false; if ((F[0] == '-') && (S[0] == '-')) { S = S.Remove(0, 1); F = F.Remove(0, 1); minus = true; } int NullsCount=Math.Abs(F.Length-S.Length); if (NullsCount != 0) { if (F.Length<S.Length) F = string.Concat(new string('0', NullsCount), F); else S = string.Concat(new string('0', NullsCount), S); } F = string.Concat("0", F); S = string.Concat("0", S); string value; string ost="0"; for (int i = F.Length - 1; i >= 0; i--) { value = (Convert.ToInt32(F[i].ToString()) + Convert.ToInt32(S[i].ToString())+Convert.ToInt32(ost)).ToString(); if (value.Length == 2) { ost = value[0].ToString(); result = string.Concat(value[1].ToString(), result); } else { ost = "0"; result = string.Concat(value[0].ToString(), result); } } if (result[0] == '0') { result = result.Remove(0, 1); } if (minus) result=string.Concat('-', result); return result; }
private static string Minus(string F, string S) { string result = ""; if ((F[0]!='-')&&(S[0]=='-')) return Sum(F,S.Remove(0,1)); else if ((F[0]=='-')&&(S[0]!='-')) return Sum(F,string.Concat("-",S)); if (S[0] == '-') S = S.Remove(0, 1); bool minus=false; if (LongEq(F, S) == 0) return "0"; else if (LongEq(F, S) == 2) minus = true; else minus = false; if (F[0] == '-') F = F.Remove(0, 1); int NullsCount = Math.Abs(F.Length - S.Length); if (NullsCount != 0) { if (F.Length < S.Length) F = string.Concat(new string('0', NullsCount), F); else S = string.Concat(new string('0', NullsCount), S); } char ost = '0'; if (minus) for (int i = F.Length-1; i >= 0; i--) { int a = Convert.ToInt16(F[i].ToString()); int b = Convert.ToInt16(S[i].ToString()); if (a > b) b += 10; result = string.Concat((b-a- System.Convert.ToInt16(ost.ToString())).ToString(),result); if (b > 9) ost = '1'; else ost = '0'; } else for (int i = F.Length - 1; i >= 0; i--) { int a = Convert.ToInt16(F[i].ToString()); int b = Convert.ToInt16(S[i].ToString()); if (a < b) a += 10; result = string.Concat((a - b - System.Convert.ToInt16(ost.ToString())).ToString(), result); if (a > 9) ost = '1'; else ost = '0'; } if (minus) return string.Concat("-", result); else return result; }
private static string TotalUmnoj(string F,string S) { if ((F == "0") || (S == "0")) return ("0"); int number = 0; if (F.Length < S.Length) { number = F.Length; string buff = F; F = S; S = buff; } else number = S.Length; string ost="0"; for (int i = 0; i < number; i++) { string buff = Umnoj1(F, S[number - i - 1]); buff = string.Concat(buff, new string('0', i)); ost = Sum(ost, buff); } return ost; }
private static string Umnoj1(string F, char C) { string result = ""; char ch = '0'; for (int i = F.Length - 1; i >= 0; i--) { string buff = (Convert.ToInt16(F[i].ToString()) * Convert.ToInt16(C.ToString())+Convert.ToInt16(ch.ToString())).ToString(); if (buff.Length == 1) { result = string.Concat(buff[0], result); ch = '0'; } else { result = string.Concat(buff[1], result); ch = buff[0]; } } if (ch == '0') return result; else return string.Concat(ch,result); }
Решение задачи: «"Учу" длинную арифметику»
textual
Листинг программы
BigInteger a=BigInteger.Parse("3423564687135871657687135432403210340354035403540"); BigInteger b=BigInteger.Parse("68716871358703587054038709708570123123078078601312301307890756"); BigInteger c; //умножение c=a*b; //сложение c=a+b; //вычитание c=a-b;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д