الگوریتم دوم رو خودم نوشتم.
نحوه ضرب کردن انسان در این الگوریتم شبیه سازی شده. پایه کار هم همون طور که قبلا گفتم اینه که به صورت رشته ای با اعداد کار میشه.
1000 فاکتوریل رو در 9 ثانیه حساب میکنه بنابراین از الگوریتم اول کندتر هست. (البته فقط در حد یک ثانیه) ولی به نظرم از الگوریتم اول قابل فهم تر است و راحت تر می تونید در اون تغییراتی رو اعمال کنید.
به دلیل کمبود وقت هنوز بهینه سازی نهایی نشده. آخه دیروز این الگوریتم رو نوشتم و به دلیل آزمون راهنمایی و رانندگی عجله داشتم :D
Loop رو هم که توضیح دادم. چون در الگوریتم خودم واسه بررسی تعداد حلقه ها داشتم در الگوریتم قبلی هم وارد کردم.
کد:int loop = 0; private string NewMultiply(string num1, string num2) { ArrayList res = new ArrayList(); string mem, row; int index = 0; for (int mainIndex = num1.Length; mainIndex > 0; mainIndex--) { mem = "0"; row = ""; for (int subIndex = num2.Length; subIndex > 0; subIndex--) { string plus = ((int.Parse(num1[mainIndex - 1].ToString()) * int.Parse(num2[subIndex - 1].ToString()) + int.Parse(mem))).ToString(); if (plus.Length > 1) { mem = plus.Substring(0, 1); row = row.Insert(0, plus.Substring(1, 1)); } else { row = row.Insert(0, plus); mem = "0"; } loop++; } if (mem != "0") row = row.Insert(0, mem); for (int i = 0; i < index; i++) { loop++; row = row.Insert(row.Length, "0"); } res.Add(row); index++; } mem = "0"; row = ""; int temp = 0; index = 0; string total = ""; Array.Sort(res.ToArray()); for (int n = 0; n < res[res.Count - 1].ToString().Length; n++) { foreach (string resString in res) { if (resString.Length - index > 0) { temp += Int32.Parse(resString.Substring(resString.Length - (index + 1), 1)); } loop++; } total = (temp + Int32.Parse(mem)).ToString(); if (total.Length > 2) { row = row.Insert(0, total.Substring(1, 2)); mem = total.Substring(0, 1); } else { row = row.Insert(0, total.Substring(0, 1)); mem = "0"; } index++; temp = 0; } if (mem != "0") row = row.Insert(0, mem); return row; }







پاسخ با نقل قول
Bookmarks