[算法]计算一个数的开方

假设被开放数为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();
        }
    }
}
View Code

 

posted on 2013-10-17 15:32  Jason-Tang  阅读(618)  评论(0)    收藏  举报

导航