hdu 1717 小数化分数2

Problem Description

Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢?
请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。

Input

第一行是一个整数N,表示有多少组数据。
每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。

Output

对每一个对应的小数化成最简分数后输出,占一行。

Sample Input

3 0.(4) 0.5 0.32(692307)

Sample Output

4/9 1/2 17/52

初步分为两种情况,有限小数、纯循环小数和非纯循环小数。循环小数的计算方法相同

1. 有限小数

    这个就直接有几位分母就写1后面加几个零。

2. 循环小数

    先将这个小数乘10的次方乘到小数点后面是纯循环,前面是不循环部分和一个循环部分的组合。

    再写一个将右边乘为纯循环小数,左边只有不循环部分。

    两式相减。

代码中,循环部分数量为n,数字为a,不循环部分数量为m,数字为b

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
using namespace std;
char ch[20];
int gcd(int a,int b)
{
    return b?gcd(b,a%b):a;
}
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        cin>>ch;
        int n=0,m=0,a=0,b=0,f=0;
        int l=strlen(ch);
        for(int i=2;i<l;i++)
        {
            if(ch[i]=='(')
            {
                f=1;
            }
            else if(ch[i]>='0'&&ch[i]<='9')
            {
                if(f)
                {
                    n++;
                    a=a*10+ch[i]-'0';
                }
                else
                {
                    m++;
                    b=b*10+ch[i]-'0';
                }
            }
        }
        int t1,t2;
        if(n==0)
        {
            t1=b;
            t2=pow(10,l-2);
        }
        else
        {
            t1=b*pow(10,n)+a-b;
            t2=pow(10,n+m)-pow(10,m);
        }
        int tmp=gcd(t2,t1);
        cout<<t1/tmp<<'/'<<t2/tmp<<endl;
    }
}

猜你喜欢

转载自blog.csdn.net/vinacky/article/details/82668581