[算法]计算一个数的开方
假设被开放数为a,如果用sqrt(a)表示根号a, 那么
((sqrt(x)-sqrt(a/x))^2=0的根就是sqrt(a)
变形得
sqrt(a)=(x+a/x)/2
所以只需设置一个约等于(x+a/x)/2的初始值,比如1,代入上面公式,可以得到一个更加近似的值,再将它代入,就得到一个更加精确的值……依此方法,最后得到一个足够精度的(x+a/x)/2的值。
如:计算sqrt(5)
设初值为2
1)sqrt(5)=(2+5/2)/2=2.25
2)sqrt(5)=(2.25+5/2.25)/2=2.236111
3)sqrt(5)=(2.236111+5/2.236111)/2=2.236068
这三步所得的结果和sqrt(5)相差已经小于0.001。
以下是C#代码实现,已调试编译通过。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace InterviewProgram { public class TestClass { /// <summary> /// 求一个数num的开方 /// 方法是假设init为这个数的开方,通过计算 (init+num/init)/2 得到一个新的数sqrtValue,可以证明这个数更接近真正的开方数 /// 再递归计算,直到满足精确条件为止 /// </summary> /// <param name="num">待计算的数</param> /// <param name="init">假设的开方结果,默认为1</param> /// <returns>开方结果</returns> public static double GetSqrt(long num, double init=1) { double sqrtValue = (init + num / init) / 2.0; double diffValue = (sqrtValue - init) > 0 ? sqrtValue - init : init - sqrtValue; if (diffValue < 0.001) { return sqrtValue; } else { return GetSqrt(num, sqrtValue); } } } class Program { static void Main(string[] args) { long num = 123; long doubleNum = num * num; Console.WriteLine("\n {0}*{1}={2}", num, num, doubleNum); Console.WriteLine("\n\nsqrt({0})={1}", doubleNum, TestClass.GetSqrt(doubleNum).ToString("#0.000")); Console.ReadKey(); } } }
posted on 2013-10-17 15:32 Jason-Tang 阅读(618) 评论(0) 收藏 举报
浙公网安备 33010602011771号