请第一个正确完成倒数和高精度计算的兄弟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; }