hdu1717 小数化分数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢?
请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。
 

 

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
 

题目大意: 有限小数, 循环小数化最简分数

解法思路:

  • 纯循环小数:用循环节作分子,9999...9(循环节是几位就有几个9)作分母即可。

  • 混循环小数:用第二个循环节以前的小数部分所组成的数,减去不循环部分所得的差,以这个差作为分数的分子;用999...9000...0做分子(9的位数是你取用的循环节的位数,0的位数是非循环部分的位数)。

代码实现:

技术分享
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 int t;
 5 string s;
 6 
 7 void print(ll a, ll b)
 8 {
 9     ll gcd = __gcd(a, b);
10     a /= gcd; b /= gcd;
11     printf("%lld/%lld\n", a, b);
12 }
13 
14 void solve()
15 {
16     cin >> s;
17     int p = -1, q = -1;
18     for (int i = 2; i < (int)s.size(); ++ i) {
19         if(s[i]==() p = i;
20         if(s[i]==)) q = i;
21     }
22     if(p == -1)
23     {
24         ll x = 0, y = 1;
25         for (int i = 2; i < (int)s.size(); ++ i) x=x*10+s[i]-0, y*=10;
26         print(x, y);
27     }
28     else if (p == 2)
29     {
30         ll x = 0, y = 0;
31         for (int i = p+1; i < q; ++ i) x=x*10+s[i]-0;
32         for (int i = 1; i <= q-p-1; ++ i) y=y*10+9;
33         print(x, y);
34     }
35     else
36     {
37         ll x = 0, y = 0;
38         for (int i = 2; i < p; ++ i) x=x*10+s[i]-0;
39         y = x;
40         for (int i = p+1; i < q; ++ i) y=y*10+s[i]-0;
41         ll ans = 0;
42         for (int i = 1; i <= q-p-1; ++ i) ans=ans*10+9;
43         for (int i = 2; i < p; ++ i) ans*=10;
44         print(y-x, ans);
45     }
46 }
47 
48 int main() {
49     scanf("%d", &t);
50     while(t--) {
51         solve();
52     }
53     return 0;
54 }
View Code

 

以上是关于hdu1717 小数化分数的主要内容,如果未能解决你的问题,请参考以下文章

小数转分数

将小数化简为分数的算法

22. 分数化小数 decimal

小数怎么化成分数

小数怎么化成分数

分数化小数