HDU - 1717 小数化分数2

小数化分数2

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5985    Accepted Submission(s): 2445

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)

 题解:不循环小数化分数很简单,现在这里介绍循环小数化分数的方法,

 日本野口哲典在《天哪!数学原来可以这样学》中介绍了如何将循环小数转化成分数的方法,现介绍如下:

1.循环小数0.7272……循环节为7,2两位,因此化为分数为72/99=1/8.即有几位循环数字就除以几个9。又如

0.123123……循环节为1,2,3三位,因此化为分数为123/999=41/333.这种方法只适用于从小数点后第一位就开始

循环的小数,如果不是从第一位就开始循环的小数,必须用下面的方法。

 2.循环小数0.41666……先把0.41666……乘以100得41.666……,可以理解为41+0.666……,所以写成分数为

41+6/9=41+2/3=125/3.因为开始乘以了100,所以再除以100,即125/3÷100=125/300=5/12.

关于这里介绍的转化方法的原理是解一元一次方程。

如下:

1.把0.232323... 化成分数 . 
设X=0.232323... 
因为0.232323... == 0.23 + 0.002323... 
所以 X = 0.23 + 0.01X 
解得:X = 23/99 

2.把0.1234123412341234...化成分数 . 
设X=0.1234123412341234... 
因为0.1234123412341234... == 0.1234 + 0.000012341234... 
所以X = 0.1234 + 0.0001X 
解得:X = 1234/9999 

3.把0.56787878...化成分数, 
因为0.56787878...= 0.56 + 0.01 * 0.787878... 
所以设X=0.787878...则X=0.78 + 0.01X 
所以X = 78/99 
所以原小数0.56787878...=0.56+ 0.01X = 0.56 + 0.078/99 = 2811/4950 

#include <iostream>
using namespace std;
int gcd(int a,int b){
    int c;
    while (b) {
        c=a;
        a=b;
        b=c%b;
    }
    return a;
}
int main() {
    int T;
    cin>>T;
    while (T--) {
    char a[15];
     cin>>a;
        int flag=0;
        int b=0,c=0;//b为非循环位数 c为循环位数;
        int x=0,y=0,z=0;//x分子 y分母 z循环数
        for (int i=2; a[i]; i++) {
            if (a[i]!='('&&flag==0) {
                x=x*10;
                x=x+a[i]-'0';
                b=b+1;
            }
            if (a[i]=='(') {
                flag=1;
                i=i+1;
            }
            if (a[i]!=')'&&flag==1) {
                z=z*10;
                z=z+a[i]-'0';
                c=c+1;
            }
        }
           if (flag&&b) {
            int tep=x;
            int m=b,n=c;
            while (n--) {
                y=y*10;
                y=y+9;
                x=x*10;
            }while (m--) {
                y=y*10;
            }
            x=x+z-tep;
        }
           if (!flag) {
            int n=b;
            y=1;
            while (n--) {
                y=y*10;
            }
         }
            if (flag&&!b) {
                int n=c-1;
                x=z;
                y=9;
                while (n--) {
                    y=y*10;
                    y=y+9;
                }
            }
        int t=gcd(x,y);
        x=x/t;
        y=y/t;
        printf("%d/%d\n",x,y);
}
return 0;
}

猜你喜欢

转载自blog.csdn.net/henu111/article/details/81187959