循环小数->分数备忘

虽然比较简单,但是代码比我的优美多了,果断转
#include <iostream>
using namespace std;
int f(int u,int v)
{
    while(u%v)
    {
      int w=u%v;
      u=v;
      v=w;
    }
    return v;
}
int main()
{
    int t;
    while(cin>>t)
    {
        while(t--)
        {
            char a[15];
            cin>>a;
            int p=0,q=0,t=0,x=0,y,k=1,l=1,max;
            for(int i=2;a[i]!='\0';i++)
            {
                if(!t && a[i]!='(') {p++;x*=10;x+=a[i]-'0';}
                if(t && a[i]!=')') {q++;y*=10;y+=a[i]-'0';}
                if(a[i]=='(') {t=1;y=x;q=p;}
            }
            if(!q)
            {
                while(p--)
                    k*=10;
                max=f(x,k);
                x/=max;
                k/=max;
                cout<<x<<'/'<<k<<endl;
            }
            else
            {
                int m=y-x;
                while(p--)
                    k*=10;
                while(q--)
                    l*=10;
                int n=l-k;
                max=f(m,n);
                m/=max;
                n/=max;
                cout<<m<<'/'<<n<<endl;
            }
        }
    }
    return 0;
}

``` #include<stdio.h> #include<stdlib.h> #define arrsize 510 typedef struct list { int x; struct list*next; struct list*front; }list; list *p,*q,*h=NULL; typedef struct list1 { int x; struct list1*next; struct list1*front; }pi; pi *ppi,*qpi,*hpi=NULL; int main() { int n; scanf("%d",&n); getchar(); for(int i=0;i<arrsize;i++) { p=(list *)malloc(sizeof(list)); if(h==NULL) { h=p; p->front=NULL; } else {q->next=p; p->front=q;} p->x=0; p->next=NULL; q=p; } h->front=NULL; for(int i=0;i<arrsize;i++) { ppi=(pi *)malloc(sizeof(pi)); if(hpi==NULL) {hpi=ppi; ppi->front=NULL;} else {qpi->next=ppi; ppi->front=qpi;} ppi->x=0; ppi->next=NULL; qpi=ppi; } hpi->front=NULL; hpi->x=4; int k=1; for(int i=0;i<arrsize;i++) { h->x=4; p=h; for(int i=0;i<arrsize;i++) { int c=p->x%(2*k+1); if(p->next!=NULL) p->next->x+=c*10; p->x/=(2*k+1); if(p->next!=NULL) p=p->next; } pi *temp=ppi; for(int i=arrsize-1;i>=0;i--) { if(k%2==1) { if(ppi->x>=p->x) ppi->x-=p->x; else { if(ppi->front!=NULL) {ppi->x+=10; ppi->x-=p->x; ppi->front->x--; } else ppi->x-=p->x; } } else{ if(ppi->x+p->x>=10) { ppi->x+=p->x-10; if(ppi->front!=NULL) ppi->front->x++; } else ppi->x+=p->x; } if(ppi->front!=NULL) { ppi=ppi->front; p=p->front; } } k++; ppi=temp; }; printf("%d.",hpi->x); ppi=hpi->next; for(int i=1;i<n+1;i++) { printf("%d",ppi->x); if(ppi->next!=NULL) ppi=ppi->next; } p=h;q=h; for(int i=0;i<arrsize;i++) { q=p->next; free(p); p=q; } ppi=hpi;qpi=hpi; for(int i=0;i<arrsize;i++) { qpi=ppi->next; free(ppi); ppi=qpi; } return 0;}```我使用莱布尼茨级数展开,使用双向链表数据结构,估计圆周率小数点后500位的数值,代码哪里有问题?不改变我的数据结构,只找问题
03-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值