[NOJ]数据结构实验1.2 高精度计算 PI 值
算法
#include<iostream>
using namespace std;
typedef struct node
{
int data;
struct node *next,*pre;
}node,*Linklist;
void In(Linklist L);
void Sum(Linklist a,Linklist b);
void Mul(Linklist a,int m);
void Div(Linklist a,int m);
int main()
{
int n,i,top,bottom,k=1;
cin>>n;
Linklist sum,R;
sum=new node;
R=new node;
In(sum);
In(R);
sum->next->data=3;
R->next->data=3;
while(k<2000)
{
top=(2*k-1)*(2*k-1);
bottom=8*k*(2*k+1);
Mul(R,top);
Div(R,bottom);
Sum(R,sum);
k++;
}
if(n==0) cout<<"3"<<endl;
else
{
sum=sum->next;
cout<<"3.";
for(i=0;i<n;i++)
{
cout<<sum->next->data;
sum=sum->next;
}
}
cout<<endl;
return 0;
}
void In(Linklist L) //链表初始化
{
Linklist p=L,q;
L->next=L;
L->pre=L;
int i;
for(i=0;i<1000;i++)
{
q=new node;
q->data=0;
q->next=L;
q->pre=p;
p->next=q;
L->pre=q;
p=q;
}
}
void Sum(Linklist a,Linklist b) //加法实现
{
Linklist p=a->pre,q=b->pre;
int x;
while(q!=b)
{
x=q->data+p->data;
q->data=x%10;
q->pre->data+=x/10;
q=q->pre;
p=p->pre;
}
}
void Mul(Linklist a,int m) //乘法实现
{
Linklist p=a->pre;
int x,y=0;
for(; p!=a; p=p->pre)
{
x=(p->data)*m+y;
y=x/10;
p->data=x%10;
}
x=(p->data)*m+y;
y=x/10;
p->data=x%10;
}
void Div(Linklist a,int m) //除法实现
{
Linklist p=a->next;
int x,y=0;
for(; p!=a; p=p->next)
{
x=p->data+y*10;
p->data=x/m;
y=x%m;
}
}