最近關於1.01和0.99的365次方的結果燃爆了網絡,大家一致推崇為年底正能量。個人對這些文字游戲不甚感冒。不過這的確讓我對其算法有了興趣。
之前在園子里看到過大數據相乘的算法,這個應該類似吧,只是多了小數點而已。
一下是我寫的代碼,首次發,望輕噴。
//參數合法性檢查略 //去除正負號和小數點 string first = double1.TrimStart('-').Replace(".",""); string second = double2.TrimStart('-').Replace(".",""); //計算 int len = first.Length+second.Length; int[] res = new int[len];//存儲結果 int t1; int t2;int t3; int SureChar; int JinWeiChar; for (int i = second.Length-1; i >=0; i--) { JinWeiChar=0; for (int j = first.Length-1; j >=0; j--) { t1 = Int32.Parse(second[i].ToString()); t2 = Int32.Parse(first[j].ToString()); t3=t1*t2+JinWeiChar+res[i+j+1]; //這里跟小學學的乘法不一樣,書上的乘法是先逐位相乘最后統一求和,這里是一位相乘后直接加上次的結果。 SureChar = t3 % 10; JinWeiChar = t3 /10; res[j+i+1] = SureChar; if(j==0) { res[j+i]=JinWeiChar; } } } //整型數組變字符串方便后面操作 StringBuilder sb=new StringBuilder(); foreach (int i in res) { sb.Append(i.ToString()); } //算小數點 int dot = 0; if (double1.Contains('.')) dot +=double1.Length-1- double1.IndexOf('.'); if (double2.Contains('.')) dot += double2.Length - 1 - double2.IndexOf('.'); sb.Insert(len - dot, "."); //去多余的0 string result= sb.ToString(); string[] arr = result.Split('.'); arr[0]=arr[0].TrimStart('0'); arr[1]=arr[1].TrimEnd('0'); if (string.IsNullOrEmpty(arr[0])) arr[0] = "0"; result = arr[0].ToString() + "." + arr[1].ToString(); //加正負號 if (double1.StartsWith("-") ^ double2.StartsWith("-")) result = "-" + result; return result.Trim('.');
附上運行結果吧

