HDU 1717 小数化分数2(最大公约数)

小数化分数2

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


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
 

 

Recommend
lcy   |   We have carefully selected several similar problems for you:  1715 1716 1166 1719 1722 
 
有限小数很简单,无限小数的化法是利用了无限小数循环的性质,把利用倍数关系去掉无穷部分。 
以0.94(375)为例子。 
现将他乘100,变为94.(375)。 
然后在取他的100000倍,变为94375.(375) 
这样两个数小数点后相同,相减后就变为整数了。 
以x代表原数; 
100000x-100x=94375.(375)-94.(375)=94281 
99900x=94281 
x=94281/99900 
好了这样就做出来了, 
剩下的就是基础的字符串操作。 
 
 1 #include <iostream>
 2 #include <cstring>
 3 #include <string>
 4 #include <algorithm>
 5 #include <cmath>
 6 using namespace std;
 7 int gcd(int a, int b)
 8 {
 9     return b == 0 ? a : gcd(b, a%b);
10 }
11 int main()
12 {
13     int n;
14     cin >> n;
15     char a[15];
16     while (n--)
17     {
18         cin >> a;
19         int l = strlen(a);
20         int i;
21         int k = 0;
22         int in = 0;//不循环的有几位
23         bool yk = 0;//是否有循环
24         int ans = 0;//总的部分
25         int dec = 0;//不循环部分
26         for (i = 2; i < l; i++)
27         {
28             if (!yk&&a[i] >= '0'&&a[i] <= '9')
29             {
30                 in++;
31             }
32             if (a[i]== '(')
33             {
34                 yk = 1;
35             }
36             if (yk&&a[i] >= '0'&&a[i] <= '9')
37             {
38                 k++;
39             }
40         }
41 
42         for (i = 2; i <= in + 1; i++)//不循环部分先化为整数部分
43         {
44             dec = dec*10 + (a[i] - '0');
45         }
46         if (!yk)//没有循环的话直接,比如0.5,dec=5,ll=10,答案为1/2
47         {
48             int ll =(int) pow(10, in);
49             int x = gcd(dec, ll);
50             cout << dec / x << "/" << ll/ x << endl;
51         }
52         else
53         {//循环的话,举例0.32(692307)
54             for (i = 2; i < l; i++)
55             {
56                 if (a[i] >= '0'&&a[i] <= '9')
57                 {
58                     ans = ans*10 + (a[i] - '0');
59                 }
60             }
61             l = l - 4;
62             ans = ans - dec;//对于该例子ans=32692307-32
63             int ll = (int)pow(10, l);
64             int lll = (int)pow(10, in);
65             ll = ll - lll;//对于该例子ll=100000000-100
66             int x = gcd(ans, ll);
67             cout << ans / x << "/" << ll/ x << endl;
68         }
69     }
70     return 0;
71 }

 

posted on 2018-02-18 21:05  蔡军帅  阅读(211)  评论(0编辑  收藏  举报