void arctg(int * arctgx, int x, int len) { int n = 1, s = 1,c = 4,d = 0; int i, *t, *a, eps = 0; t = new int[len+1]; a = new int[len+1]; for(i=0;i<len;i++) { t[i] = c / x; d = c % x; c = d*10; } while(eps<len-1) { d = 0; for(i=0;i<len;i++) { c = t[i]+d*10; a[i] = c / n; d = c % n; } for(i=1;i<len;i++) { if (a[i]) { eps = i; break; } else eps++; } if(s==1) { for(i=len-1;i>0;i--) { c = arctgx[i] + a[i]; arctgx[i] = c%10; arctgx[i-1]+= c/10; } } else { for(i=len-1;i>0;i--) {
arctgx[i]-=a[i]; if (arctgx[i]<0) { arctgx[i] += 10; arctgx[i-1]-=1; } } } n = n+2; s = -s; d = 0; for(i=0;i<len;i++) { c = t[i]+d*10; t[i] = c / x; d = c % x; } d = 0; for(i=0;i<len;i++) { c = t[i]+d*10; t[i] = c / x; d = c % x; } } delete []t; delete []a; }
int main() { DWORD dwStart,dwStop; //调用系统功能来计时 dwStart=GetTickCount(); //开始计时 int c, d, len; int decimal, *arctg5, *arctg239, *pi; cout << "请输入所要计算的π的精度值:"; cin >> decimal; len = decimal+10; arctg5 = new int[len+1], arctg239 = new int[len+1], pi = new int[len+1]; cout << "计算进行中,请稍等……" << endl; for(int i=0;i<len;i++) { arctg5[i] = 0; arctg239[i] = 0; } arctg(arctg5, 5, len); arctg(arctg239, 239, len); d = 0; for(i=len-1;i>=0;i--) { c = arctg5[i]*4 + d; pi[i] = c % 10; d = c / 10; } delete []arctg5; for(i=len-1;i>0;i--) { pi[i]-=arctg239[i]; if (pi[i]<0) { pi[i] += 10; pi[i-1]-=1; } } delete []arctg239; cout<< "π= " << pi[0] << '.'; for(i=1;i<=decimal;i++) { cout<<pi[i]; } delete []pi; dwStop=GetTickCount(); //计时结束 cout<<endl; cout<<"计算用时:"<<(double)(dwStop-dwStart)/1000<<"秒"<<endl; return 0; }
------ for循环啊! 不过要注意数据的类型! double int 可能可以 ------
------ 我不建议用递归,本来就这么大,一辈子都输出不完,用递归没那么大内存。 我建议用普通方式运算,将结果放到链表里,注意进位,插入元素。 在汇编当中就是这样实现存放大数的,方式很简单,就是麻烦。 ------ up