这个高精度计算pi值的程序用的是什么思想?急

C语言 码拜 3年前 (2017-04-22) 384次浏览
#include <stdio.h>
#include <stdlib.h>
#define MAX 1000
typedef struct DuLNode{
    int            data;
    struct DuLNode *first;
    struct DuLNode *last;
    struct DuLNode *prior;
    struct DuLNode *next;
   }DuLNode,*DuLinkList;      //创建双向链表
void InitLinkList(DuLNode **p)
{
    *p=(DuLinkList)malloc(sizeof(DuLNode));
	if(*p!=0)(*p)->next=(*p)->prior=*p;
}
void Create(DuLinkList L)
{
	DuLinkList p=L,q;
    int i;
    L->first=p;
	for(i=0;i<MAX;i++){
		q=(DuLinkList)malloc(sizeof(DuLNode));
		q->data=0;
		p->next=q;
		q->prior=p;
		q->next=NULL;
		p=q;
	}
	L->last=q;
}
void Jia(DuLinkList a,DuLinkList b)
{
	DuLinkList p=a->last,q=b->last;
	int x;
	while(q!=b->first)
	   {
		x=q->data+p->data;     //i位的数
		q->data=x%10;          //i位的个位
		q->prior->data+=x/10;  //进位
		q=q->prior;
		p=p->prior;
	   }
}
void Cheng(DuLinkList a,int k)
{
	DuLinkList p=a->last;
	int x,y=0;
	for(;p!=a->first;p=p->prior)
        {
		x=(p->data)*k+y;//i位的数
		y=x/10;//进位加数
		p->data=x%10;//i位的个位
	    }
	    x=(p->data)*k+y;//i位的数
		y=x/10;//进位加数
		p->data=x%10;//i位的个位
}
void Chu(DuLinkList a,int k)
{
	DuLinkList p=a->first;
	int x,y=0;
	for(;p!=NULL;p=p->next)
	    {
		x=p->data+y*10;//借位除
		p->data=x/k;//整除数
		y=x%k;//余数
	    }
}
void Calculation(int n)
{
	int i,top=1,bottom=3,x=0;
	DuLinkList sum,num,l,p;
	InitLinkList(&sum);
	InitLinkList(&num);
	Create(sum);
	Create(num);
	sum->first->data=2;
	num->first->data=2;
	l=num;
	while(x++<1800)
	    { 
       Cheng(num,top);
		Chu(num,bottom);
        Jia(num,sum);
		top++;bottom+=2;
        }
        printf("3.");
        for(i=0;i<n;i++)
        {
        printf("%d",sum->next->data); //从十分位开始打印
        sum=sum->next;
        }
}
int main(){
	int n;
	scanf("%d",&n);
	Calculation(n);
	printf("\n");
	return 0;
}
解决方案

30

唔看错了。这是newton/euler变换:pi/2=1+1/3*(1+2/5*(1+3/7*(1+…)))

20


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明这个高精度计算pi值的程序用的是什么思想?急
喜欢 (0)
[1034331897@qq.com]
分享 (0)