小数化分数

http://acm.hdu.edu.cn/showproblem.php?pid=1717

 

0.(33)=a

100a-a=33

a=33/99;

如果有非循环部分 把非循环部分化成分数与循环部分直接相加即可.

#include<stdio.h>
#include<string.h>

void huajian(int *a,int *b);

main()
{
    int n,i,cnum,mnum,num,len;
    int point,lkflag,rkflag;
    char str[101];
    while(scanf("%d",&n)!=EOF)
    {
        cnum=i=len=num=lkflag=rkflag=0;
    scanf("%s",str);
    if(str[0]=='0'&&strlen(str)==1)
    {
    printf("0/0\n");
    continue;    
    }
    if(str[0]=='-')
    printf("-");
        while(str[i]!='.')
        i++;
        i++;
        len-=i;
        while(str[i]!='\0')
        {
            if(str[i]=='(')
            {
                lkflag=i;
                i++;
                len--;
                while(str[i]!=')')
                {
                    cnum=cnum*10+str[i]-'0';
                    i++;
                }
                rkflag=i;
                len--;
                break;
            }
                num=num*10+str[i]-'0';
            i++;
        }
        len+=i;
        if(lkflag==0)
        {
            mnum=1;
            for(i=0;i<len;i++)
            mnum*=10;
             if(num==0)
              {
                  printf("0/0\n");
                  continue;
                }
            huajian(&num,&mnum);
            printf("%d/%d\n",num,mnum);
        }
        if(lkflag!=0)
        {
            mnum=1;
             for(i=0;i<rkflag-lkflag-1;i++)
               mnum*=10;
               mnum-=1;
               cnum=num*mnum+cnum;
            for(i=0;i<=len-(rkflag-lkflag)+1;i++)
              mnum*=10;
              if(cnum==0)
              {
                  printf("0/0\n");
                  continue;
                }
              huajian(&cnum,&mnum);
              printf("%d/%d\n",cnum,mnum);
        }
    }
}

void huajian(int *a,int *b)
{
    int r,num1,num2;
    if(*a%*b==0)
    {
        *a=*a/(*b);
        return;
    }
    num1=*a;
    num2=*b;
    r=*a%*b;
    while(r)
    {
        *a=*b;
        *b=r;
        r=*a%*b;
    }
    *a=num1/(*b);
    *b=num2/(*b);
    return ;
}

你可能感兴趣的:(小数化分数)