最近关于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('.');
附上运行结果吧