hdu_1717_小数化分数2

一看此题,顿觉茫然,搜得思路,方知原来可以这样。最是累完了,错一点,就得那个望眼欲穿的改哇!

首先须知:小数有 有限和无限之分,其中无限小数中,又分无限循环和无限不循环小数,能用分数表示的当然只有有限小数和无限循环小数。

有限小数就简单了,无论多少只要小数点后面的 除以 10的n次方就行了,约分一下就完事了。

对于无限循环小数分两种,这里举例说明:

⑴    把0.4747……化成分数。

 0.4747……×100=47.4747……  

       0.4747……×100-0.4747……=47.4747……-0.4747……            注:因为是无限小数,所以小数点后趋向于无穷远处的 相减极限为零了

             (100-1)×0.4747……=47                                 //提取公因式0.4747         


                    即99×0.4747…… =47

                        那么  0.4747……=47/99

(2)把0.325656……化成分数,(道理同上)

 0.325656……×100=32.5656……①

            0.325656……×10000=3256.56……②

              用②-①即得:

                    0.325656……×9900=3256.5656……-32.5656……

                        0.325656……×9900=3256-32

                           所以, 0.325656……=3224/9900

这里

View Code
 1 #include<iostream>
 2 #include<math.h>
 3 #include<string.h>
 4 using namespace std;
 5 
 6 
 7 int gcd(int xiao,int da)
 8 {
 9     while(xiao%da)
10     {
11       int tmp=xiao%da;
12       xiao=da;
13       da=tmp;
14     }
15     return da;
16 }
17 
18 
19 
20 int main()
21 {
22     int T;
23     while(cin>>T){
24     int i,a,b,cnta,cntb,max;
25     int k,l;
26     
27     char ch[15];
28     while(T--)
29     {
30         cin>>ch;
31         bool flag = true;
32         a = 0;    b = 0; cnta = 0;cntb = 0;
33         k = 1; l = 1;
34         for(i = 2;ch[i] != '\0'; i++)
35         {
36             if(ch[i] == '(')
37             {
38                 flag = false;
39                 b = a;
40                 cntb = cnta;
41                 continue;
42             }
43             if(ch[i] == ')')
44                 break;
45             if(flag)
46             {
47                 a = a*10  + ch[i]-'0';
48                 cnta++;    
49             }
50             else
51             {
52                 b = b*10 + ch[i] - '0';
53                 cntb++;
54             }
55             
56         }
57         if(!cntb)
58         {
59             while(cnta--)
60                 k *= 10;
61             max = gcd(a,k);
62 
63             cout<<a/max<<'/'<<k/max<<endl;
64         }
65         else
66         {
67             while(cnta--)
68                 k *= 10;
69             while(cntb--)
70                 l *= 10;
71             max = gcd(b-a,l-k);
72             cout<<(b-a)/max<<'/'<<(l-k)/max<<endl;
73         }
74     }
75         
76     }
77     return 0;
78 }
原文地址:https://www.cnblogs.com/konkon/p/hdu_1717_DecimalDividedSeveral.html