高精度计算pi(C语言)

时间:2025-02-10 10:44:45
#include <> #include <> typedef struct node{ int date; struct node* pre; struct node* next; }node; void insert(node* list,int date){ //尾插法向链表中添加元素 node* p = list; if(p==NULL){ return; } else{ while(p->next){ p = p -> next; } node* pnew=(node*)malloc(sizeof(node)); pnew -> date = date; p -> next = pnew; pnew-> pre =p; pnew -> next = NULL; } } void tranverselist(node* list,int n){ //遍历链表并输出指定位数的小数 node* p = list; p=p->next; printf("%d.",p->date); int i; p=p->next; for(i=0;i<n;i++){ printf("%d",p->date); if(p->next){ p=p->next; } } printf("\n"); } int main() { node *num,*sum;//num为每次相加的 R(n); um最终的值约等于 Π; num=(node*)malloc(sizeof(node)); sum=(node*)malloc(sizeof(node)); num -> pre = NULL; sum -> pre = NULL; num -> next = NULL; sum -> next = NULL; int n; scanf("%d",&n); //n为题目要求输出的的Π的小数位数; int i; for(i=0;i<520;i++){//补够位数 insert(num,0); insert(sum,0); } node* p1 = num -> next; node* p2 = sum -> next; //使两个链表除头节点外第一个节点的数据为2 p1->date=2; p2->date=2; //指向num,和sum的尾节点 while(p1->next){ p1=p1->next; } node* numtail = p1; while(p2->next){ p2=p2->next; } node* sumtail = p2; //开始运算; int temp = 0;//计算过程中产生的临时数据 int ret = 0; //计算过程中产生的借位or进位 int t;//计算时有规律出现的除数 (2n+1) for(i=1,t=3;i<10000;i++,t=t+2){//根据数学的知识,算的次数越多越精确 //i同时承担计数和做乘数的任务 //先计算乘法(即公式中R(n)*n) node* p3 = numtail; ret=0; while(p3) { temp = p3 -> date * i + ret; p3 -> date = temp%10; ret = temp/10; p3 = p3 -> pre; } ret = 0; p3 = num -> next; //计算除法 (即公式中的R(n)*n/(2*n+1)) while(p3){ temp = p3 -> date + ret*10; ret = temp % t; p3 -> date = temp/t; p3=p3->next; } ret = 0; node* p4 = sumtail; p3 = numtail; //将得到的R(n)的值加入到结果中 while(p3&&p4){ temp = p3 -> date + p4->date +ret ; ret = temp/10; p4->date=temp%10; p3=p3->pre; p4=p4->pre; } } tranverselist(sum,n); return 0; }