hdu1717 小数化分数2

题目链接:

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

小数化分数2

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

Total Submission(s): 2921    Accepted Submission(s): 1187

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)

Recommend

lcy   |   We have carefully selected several similar problems for you:  1715 1716 1166 1719 1722

这个题目参见百度

http://zhidao.baidu.com/link?url=cJ2IRdzhGzhB3Ct4l0hic1K31tF-tKeb5oI0YlKE5huks_FNDHsNYEfXPfvV1yZTH9XWpU0eOosRlvOlI-MAOa

代码为:

#include<cstdio>
#include<cstring>
const int maxn=10+10;
char str[maxn];

int gcd(int a,int b)
{
    return b==0?a:gcd(b,a%b);
}

int cal1(int x)
{
    int ans=1;
    for(int i=1;i<=x;i++)
        ans=ans*10;
    return ans;
}

int cal2(int x)
{
    int ans=0;
    for(int i=1;i<=x;i++)
        ans=ans*10+9;
    return ans;
}

int main()
{
    int t,ok,len,start,end,num;
    int son,mother,extra;
    int ans;
    scanf("%d",&t);
    while(t--)
    {
        ok=1;
        scanf("%s",str);
        len=strlen(str);
        for(int i=0;i<len;i++)
        {
            if(str[i]=='(')
               {
                   start=i;
                   ok=0;
               }
            if(str[i]==')')
               {
                   end=i;
                   ok=0;
               }
        }
        if(ok==1)
        {
            son=0;
            mother=cal1((len-2));
            for(int i=2;i<len;i++)
                son=son*10+(str[i]-'0');
        //    printf("mother:%lld son:%lld\n",mother,son);
            ans=gcd(son,mother);
            printf("%d/%d\n",son/ans,mother/ans);
        }
        else if(!ok&&start==2)
        {
            son=0;
            int circle=end-1-start;
            for(int i=3;i<end;i++)
                son=son*10+(str[i]-'0');
            mother=cal2(circle);
            ans=gcd(son,mother);
            printf("%d/%d\n",son/ans,mother/ans);
        }
        else
        {
            son=0;
            extra=0;
            int circle=end-1-start;
            for(int i=2;i<start;i++)
                extra=extra*10+str[i]-'0';
            for(int i=start+1;i<end;i++)
                son=son*10+(str[i]-'0');
            mother=cal2(circle);
            int copymother=cal1(start-2);
            //printf("copymother%I64d\n",copymother);
           // printf("extra:%lld son:%lld mother:%lld\n",extra,son,mother);
            son=mother*extra+son;
            ans=gcd(son,mother);
            son=son/ans;
            mother=mother/ans;
           // printf("%lld/%lld\n",son/ans,mother/ans);
            mother=mother*copymother;
            ans=gcd(son,mother);
            printf("%d/%d\n",son/ans,mother/ans);
        }
    }
    return 0;
}

hdu1717 小数化分数2,布布扣,bubuko.com

时间: 2024-10-23 17:25:44

hdu1717 小数化分数2的相关文章

HDU1717小数化分数2

小数化分数2 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4278    Accepted Submission(s): 1725 Problem Description Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢?请你写一个程序不但可以

hdu1717 小数化分数

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1717 小数化分数2 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5375    Accepted Submission(s): 2188 Problem Description Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他

ACM学习历程—HDU1717 小数化分数2(gcd)

Description Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢? 请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数. Input 第一行是一个整数N,表示有多少组数据. 每组数据只有一个纯小数,也就是整数部分为0.小数的位数不超过9位,循环部分用()括起来. Output 对每一个对应的小数化成最简分数后输出,占一行. Sample Input 3 0.(4) 0.5

小数化分数2

小数化分数2 题目 Problem Description Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢? 请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数. Input 第一行是一个整数N,表示有多少组数据. 每组数据只有一个纯小数,也就是整数部分为0.小数的位数不超过9位,循环部分用()括起来. Output 对每一个对应的小数化成最简分数后输出,占一行. Sample

(hdu step 2.1.8)小数化分数2(小数化分数——包括了循环小数化分数的情况)

题目: 小数化分数2 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2783 Accepted Submission(s): 993   Problem Description Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢?请你写一个程序不但可以

hdu 1717 小数化分数2 (数论)

点我点我点我!!! 接下来要做的就是模拟上述过程了. 静下来想一下自己要得到的信息. 然后拿出来,就可以了,模拟嘛,都是这样的. #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; char str[20]; int gcd(int a,int b) { return a%b==0?b:gcd(b,a%b); }

HDU1717 (循环小数化分数)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1717 分析: 我们将这个循环小数分成三部分0.a1a2a3a4....an(b1b2bb3...bm) 分成0,不循环的部分a1a2...an,和循环节b1b2b3...bm 设这个小数为X,a1a2a3....an=s1, b1b2b3...bm=s2,y=0.(b1b2b3b4..bm) X * 10^n = s1 + y;       ---------1) y * 10^m = s2 +

【HDOJ】1717 小数化分数2

简单字符串处理. 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <ctype.h> 5 6 #define MAXN 25 7 char str[MAXN]; 8 int ten[15]; 9 10 int gcd(int m, int n) { 11 if (m == 0) 12 return n; 13 if (m > n) 14 return gcd(

HDU 1717 小数化分数2

http://acm.hdu.edu.cn/showproblem.php?pid=1717 之前莫名WA了挺多次的有趣的题orz 感觉还是写麻烦了 注意字符串处理 代码:  0MS  1068K #include <cstdio> #include <cstring> using namespace std; int gcd(int m, int n) { int r; while (n) { r = m % n; m = n; n = r; } return m; } int