#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