作者在 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 < 1)a*100(当做大于1去算)
如果a > 1000,用while(a > 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 >=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) <= 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 >= 10000)
{
do
{
m /= 100;
i ++;
}while(m >= 1000);
}
printf("这个数的开平方是: %lf\n",sqr(m) * pow(10,i));
}
else
{
while(m <1)
{
m *= 100;
j ++;
}
printf("这个数的开平方是: %lf\n",sqr(m) / pow(10,j));
}
return 0;
}
要求:不能用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 < 1)a*100(当做大于1去算)
如果a > 1000,用while(a > 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 >=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) <= 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 >= 10000)
{
do
{
m /= 100;
i ++;
}while(m >= 1000);
}
printf("这个数的开平方是: %lf\n",sqr(m) * pow(10,i));
}
else
{
while(m <1)
{
m *= 100;
j ++;
}
printf("这个数的开平方是: %lf\n",sqr(m) / pow(10,j));
}
return 0;
}