小数转分数

2017年02月24日 14点热度 0人点赞 0条评论

简述
初中学数学的时候,小明最头痛的就是小数。最最头痛的就是循环小数。最最最头痛的就是老师总是喜欢让他把小数转成分数。偶尔遇到循环小数转分数的题目,小明总是想到辍学出去打工。一个初中生,出去能干什么呢?大家写段代码,帮帮这个可怜的孩子吧,他还年轻。
输入
输入包含两行,第一行为一个整数N,代表接下来有N组待转换的小数。然后为待转换的小数。每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。 注意:小数的位数不超过9位指的是输入的时候小数点后的数字的个数不超过9位,比如说0.32(692307)表示这个小数的位数是8位。 
输出
对每一个对应的小数化成最简分数后输出,占一行。 
样例输入
3
0.(4)
0.5
0.32(692307)
0
样例输出
4/9
1/2
17/52

直到输入待测数据组数N为0的时候,程序终止!

我的代码

#include
#include
#include
using namespace std;
void fun(int& a,int& b,int c,int d)
{
    unsigned long long b1,a1,m,i,t1=a,t2=b,t3=c,t4=d;
    b1=t2*t4,a1=t1*t4+t2*t3;
    m=min(a1,b1);
    for(i=2; i<=m; i++)
        if(a1%i==0&&b1%i==0)
        {
            a1/=i;
            b1/=i;
            i=1;
            m=min(a1,b1);
        }
    a=a1,b=b1;
}
int Pow(int i)
{
    int t=1;
    for(int j=1; j<=i; j++)
        t*=10;
    return t;
}
int P1(int i)
{
    int t=0;
    for(int j=1; j<=i; j++)
        t=t*10+9;
    return t;
}
int main()
{
    int a,i,a1,a2,n,flag;
    char s1[10],s2[10],s3[10],t;
    while(cin>>n&&n)
    {
        getchar();
        while(n--)
        {
            flag=0;
            s1[0]=s1[0]=s3[0]=0;
            i=0;
            t=getchar();
            if(t=='-')
                flag=1;
            else
                s1[i++]=t;
            while(1)
            {
                t=getchar();
                if(t=='n')
                {
                    s1[i]=0;
                    goto End;
                }
                if(t=='.')
                {
                    s1[i]=0;
                    break;
                }
                s1[i++]=t;
            }
            i=0;
            while(1)
            {
                t=getchar();
                if(t=='(')
                {
                    s2[i]=0;
                    break;
                }
                if(t=='n')
                {
                    s2[i]=0;
                    goto End;
                }
                s2[i++]=t;
            }
            i=0;
            while(1)
            {
                t=getchar();
                if(t==')')
                {
                    s3[i]=0;
                    getchar();
                    goto End;
                }
                s3[i++]=t;
            }
End:
            ;
            a1=0;
            a2=1;
            if(strlen(s1)!=0&&s1[0]!='0')
            {
                sscanf(s1,"%d",&a);
                a1=a;
            }
            if(strlen(s2)!=0)
            {
                sscanf(s2,"%d",&a);
                fun(a1,a2,a,Pow(strlen(s2)));
            }
            if(strlen(s3)!=0)
            {
                sscanf(s3,"%d",&a);
                fun(a1,a2,a,P1(strlen(s3))*Pow(strlen(s2)));
            }
            if(flag)
                cout<<'-';
            cout<         }
    }
    return 0;
}

未经允许不得转载!小数转分数

update

纸上得来终觉浅, 绝知此事须躬行。