问题描述:限制使用双向链表作存储结构,请根据用户输入的一个整数(该整数表示精确到小数点后的位数,可能要求精确到小数点后500位),高精度计算PI值。可以利用反三角函数幂级展开式来进行计算。
code:
#include <stdio.h>
#include <stdlib.h>
#define MAX 1000
typedef struct Node
{
int data;
struct Node *pre;
struct Node *next;
} LNode,*LinkList;
void Create(LinkList L);
void Sum(LinkList a,LinkList b);
void Multiply(LinkList a,int k);
void Divide(LinkList a,int k);
int main()
{
int n,i,top,bottom,s=1;
scanf("%d",&n);
LinkList sum,R;
sum=(LinkList)malloc(sizeof(LNode));
R=(LinkList)malloc(sizeof(LNode));
Create(sum);
Create(R);
sum->next->data=3;
R->next->data=3;
while(s<2000)
{
top = (2*s-1)*(2*s-1);
bottom=8*s*(2*s+1);
Multiply(R,top);
Divide(R,bottom);
Sum(R,sum);
s++;
}
if(n==0)
{
printf("3\n");
}
else
{
sum=sum->next;
printf("%d.",sum->data);
for(i=0; i<n; i++)
{
printf("%d",sum->next->data);
sum=sum->next;
}
}
printf("\n");
return 0;
}
void Create(LinkList L)
{
LinkList p=L,q;
int i;
L->next=L->pre=L;
for(i=0; i<MAX; i++)
{
q=(LinkList)malloc(sizeof(LNode));
q->data=0;
p->next=q;
q->pre=p;
q->next=L;
L->pre=q;
p=q;
}
}
void Sum(LinkList a,LinkList b)
{
LinkList p=a->pre,q=b->pre;
int n;
while(q!=b)
{
n=q->data+p->data;
q->data=n%10;
q->pre->data+=n/10;
q=q->pre;
p=p->pre;
}
}
void Multiply(LinkList a,int n)
{
LinkList p=a->pre;
int x,y=0;
for(; p!=a; p=p->pre)
{
x=(p->data)*n+y;
y=x/10;
p->data=x%10;
}
x=(p->data)*n+y;
y=x/10;
p->data=x%10;
}
void Divide(LinkList a,int n)
{
LinkList p=a->next;
int x,y=0;
for(; p!=a; p=p->next)
{
x=p->data+y*10;
p->data=x/n;
y=x%n;
}
}