最近突然想起来数学中的如下规律:
1 = 1;
4 = 1 + 3;
9 = 1 + 3 +5;
16 = 1 + 3 +5 + 7;
25 = 1 + 3 +5 + 7 + 9;
36 = 1 + 3 +5 + 7 + 9 + 11;
49 = 1 + 3 +5 + 7 + 9 + 11 +13;
...
利用该公式可以计算开方,而且进行特殊处理便可以小数点后面几位。不过限于整数的长度,计算精度和范围有限。
闲时自己动书编写了如下程序:
#include <stdio.h>
float sqrt(float num, int precision)
{
int m;
int n;
int data, j;
float value;
for(m = 1, j = 1; j <= precision; j++)
{
if(num * m < 0xFFFFFFFF/100)
{
m *= 100;
}
else
{
printf ("the number or precision is beyond the scope\n");
return 0.0;
}
}
data = (int) (num * m + 0.5);
for(n = 0, j = 0; j < data; n++)
j += (2 * n + 1);
if(j - data >= n )
n = n - 1;
value = (float)n;
for(j = 1; j <= precision; j++)
value /= 10;
return value;
}
int main(void)
{
printf ("sqrt(2, 0) = %.0f\n",sqrt((float)2, 0) );
printf ("sqrt(2, 1) = %.1f\n",sqrt((float)2, 1) );
printf ("sqrt(2, 2) = %.2f\n",sqrt((float)2, 2) );
printf ("sqrt(2, 3) = %.3f\n",sqrt((float)2, 3) );
printf ("sqrt(2, 4) = %.4f\n",sqrt((float)2, 4) );
printf ("sqrt(2, 5) = %.5f\n",sqrt((float)2, 5) );
printf ("sqrt(2.5, 1) = %.1f\n",sqrt((float)2.5, 1) );
printf ("sqrt(16, 0) = %.0f\n",sqrt((float)16, 0) );
printf ("sqrt(625, 3) = %.3f\n",sqrt((float)625, 3) );
printf ("sqrt(6000, 3) = %.3f\n",sqrt((float)6000, 3) );
printf ("sqrt(7000, 2) = %.2f\n",sqrt((float)7000, 2) );
return 0;
}
输出结果如下:
sqrt(2, 0) = 1
sqrt(2, 1) = 1.4
sqrt(2, 2) = 1.41
sqrt(2, 3) = 1.414
sqrt(2, 4) = 1.4142
the number or precision is beyond the scope
sqrt(2, 5) = 0.00000
sqrt(2.5, 1) = 1.6
sqrt(16, 0) = 4
sqrt(625, 3) = 25.000
the number or precision is beyond the scope
sqrt(6000, 3) = 0.000
sqrt(7000, 2) = 83.67