/*
你已经学到很多了,这都有用的,只是暂时还没用到,别着急.
有很多人到大学才开始学C,你已经领先他们很多了,而有更多的人自学的,他们的路更难走...
加油吧,你可以做得很好的.
你比赛那题这让我想起了初中的一道智力题.不过,那是用笔算的.
思路是这样的:
要找这个数a的开方,先算(1/2*a)^2,
如果它小于原数,就算(1/2*a+1/4*a)^2,还小,就再算(1/2*a+1/4*a+...+1/2n...)^2直到大于原数,就到下面.
如果它大于原数,就算(1/2*1/2*a)^2,还大,就算((1/2)^n *a)^2.直到小于原数.又继续上面的.
如此迭代, 直到找到接近它精度值为止,可求出满意解.
a小于1的数的,用while(a < 1)a*100(当做大于1的数去算)
精度嘛,由于机器问题,只算到pow(10,-6)
我试了下,能算小一点的数(10^3要1分多钟),想算大的,得等一下,机器好的会快一点.
如果要说算法嘛,应该可以算动态规划法+回溯法
刚做好的,应该还有更好的处理方法,请高手指教...
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;
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)
printf("这个数的开平方是: %lf\n",sqr(m));
else
{
while(m <1)
{
m *= 100;
i ++;
}
printf("这个数的开平方是: %lf\n",sqr(m)/pow(10,i));
}
return 0;
}