请第一个正确完成倒数和高精度计算的兄弟czz5242199接分
呵呵,做人要讲诚信。既然czz5242199第一个正确完成任务,那一百分当之无愧。关于算法就不多说什么了,这里我想聊聊关于为了得到小数点后K位的精确值,实际运算中至少应该保留多少位。
假设我们实际计算中使用了P位,P位之后的值舍去,那么它的误差将小于10^P。
用这样的值做加法时,误差会线性累加。对于前100个倒数的和来说,累积误差将小于100 * 10^P,即10^(p - 2)。
那么之前的P-3位应该是精确的。
由此可知,如果想要1000位的精确值,实际计算中至少应该使用1003位来计算。
下面是我关于这一任务的代码,供各位参考。
程序代码:#include<stdio.h>
#define BASE 100000
#define LENGTH 202
void show(int *a, int n)
{
int i;
printf("%d.", a[0]);
for(i = 1; i < n; printf("%05d ", a[i++])) if(i % 10 == 1) putchar('\n');
}
void getInv(int *a, int n, int b)
{
int i, r = 1;
for(i = 0; i < n; i++)
{
a[i] = r / b;
r = r % b * BASE;
}
}
void add(int *a, int *b, int n)
{
int i, f = 0;
for(i = n - 1; i >= 0; i--)
{
a[i] += b[i] + f;
if(a[i] >= BASE)
{
a[i] -= BASE;
f = 1;
}
else f = 0;
}
}
int main()
{
int a[LENGTH] = {1}, b[LENGTH], i;
for(i = 2; i <= 100; i++)
{
getInv(b, LENGTH, i);
add(a, b, LENGTH);
}
show(a, 201);
return 0;
}









