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

2007省赛集训队练习赛(2)

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 }

时间: 2024-08-01 08:27:14

hdu1717 小数化分数的相关文章

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 在数学课上听老师说,任何小数都能表示成分数的形式

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 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢?请你写一个程序不但可以

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