编程实现sqrt()

作者在 2008-06-11 00:43:25 发布以下内容
  编程实现sqrt()
  要求:不能用math.h提供的sqrt(),编程实现sqrt()功能.
  这是一个朋友的竞赛题,我觉得挺有意思的,也做了下.

  思路是这样的:
  要找这个数a的开方,先算(1/2*a)^2,
  如果它小于原数,就算(1/2*a+1/4*a)^2,还小,就再算(1/2*a+1/4*a+...+1/2n*a...)^2直到大于原数,就到下面.
  如果它大于原数,就算(1/2*1/2*a)^2,还大,就算((1/2)^n *a)^2.直到小于原数.又继续上面的.

  如此迭代, 直到找到接近它精度值为止,可求出满意解.

  如果a < 1,用while(a &lt; 1)a*100(当做大于1去算)
  如果a > 1000,用while(a &gt; 1000)a /100(当做小于1000去算)
  这样做可以加快运算速度.

  精度嘛,由于机器问题,只算到pow(10,-6)

  如果要说算法嘛,应该可以算动态规划法+回溯法

  刚做好的,应该还有更好的处理方法,请高手指教...

  PS:其实,说不能用sqrt(a),没说不能用pow(a,0.5)...

#include<stdio.h>
#include<math.h>
double di(double n)
{
    return 0.5*n;
}
double mu(double n)
{
    return 2*n;
}
double ab(double n)
{
    if(n &gt;=0)return n;
    else return -n;
}
double sqr(double n)
{
    int i;
    double a,temp = n;   
    do
    {
        temp = di(temp);
        a = temp*temp-n;   
        for(i = 1; a < 0; i++)
        {
            temp += temp*pow(2,-i);
            a = temp*temp-n;
        }
        if(ab(a) &lt;= pow(10,-6))                   
            return temp;           
    }while(ab(a) >= pow(10,-6));
}

int main(void)
{
    int i = 0,j = 0;
    double m;
    printf("请输入一个数: ");
    scanf("%lf",&m);
    if(m < 0)
    {
        printf("负数没有开平方!\n");
        return 0;
    }
    if(m == 0||m == 1)
    {
        printf("这个数的开平方是: %lf\n",m);
        return 0;
    }
    if(m > 1)
    {
        if(m &gt;= 10000)
        {
            do
            {
                m /= 100;
                 i ++;
            }while(m &gt;= 1000);
        }
        printf("这个数的开平方是: %lf\n",sqr(m) * pow(10,i));
    }
    else
    {
        while(m &lt;1)
        {
            m *= 100;
            j ++;
        }
        printf("这个数的开平方是: %lf\n",sqr(m) / pow(10,j));
    }
    return 0;
}



C语言 | 阅读 5843 次
文章评论,共0条
游客请输入验证码
浏览5842次
文章归档
最新评论