HDU 1717 小数化分数2(数学)

小数化分数2

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)


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
 

Source
2007省赛集训队练习赛(2)
 
/************************************************************************/

该题为中文题,而且题目讲得很直白,无非就是让我们将无限循环小数或有限小数转化成分数,故题意不再多讲

至于如何做到小数与分数地转化呢,不妨稍微来学习一下

首先无限循环小数0.333…可以表示成


它的分数形式是1/3,这个想必大家都是清楚的,那是如何转化的呢?

②-①,可得


再举一个例子,说不定你就会有所发现

比如无限循环小数0.131313…,按照上述方式,可以得到


若不再是纯小数的话,我们要怎么办呢

比如说无线循环小数0.2777777…,分为不循环部分0.2与循环部分0.077777…

这样的话我们只需做点处理就可以


具体的可以去看看循环小数化分数的一些数学知识,留下链接以供学习

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<stdlib.h>
#include<cmath>
#include<string>
#include<algorithm>
#include<iostream>
#define exp 1e-10
using namespace std;
const int N = 20;
const int inf = 1000000000;
const int mod = 1000000007;
int gcd(int x,int y)
{
    while(x!=y)
        if(x>y)
            x-=y;
        else
            y-=x;
    return x;
}
char s[N];
int main()
{
    int t,i,a,b,c,d;
    bool flag;
    scanf("%d",&t);
    while(t--)
    {
        flag=false;b=a=c=0,d=1;
        scanf("%s",s);
        for(i=2;s[i]!='\0';i++)
            if(s[i]=='(')
               flag=true;
            else if(flag&&s[i]!=')')
            {
                a=a*10+s[i]-'0';
                b=b*10+9;
            }
            else if(!flag)
            {
                c=c*10+s[i]-'0';
                d*=10;
            }
        if(!a)
        {
            i=gcd(c,d);
            printf("%d/%d\n",c/i,d/i);
        }
        else
        {
            c=a+c*b;
            d=d*b;
            i=gcd(c,d);
            printf("%d/%d\n",c/i,d/i);
        }
    }
    return 0;
}
菜鸟成长记


你可能感兴趣的:(数学,ACM)