思路:

循环小数化分数,枚举所有可能的循环节,取分母最小的那个。

实现:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <string>
 4 using namespace std;
 5 
 6 const int INF = 0x3f3f3f3f;
 7 
 8 int gcd(int a, int b)
 9 {
10     return !b ? a : gcd(b, a % b);
11 }
12 
13 int lcm(int a, int b)
14 {
15     return a / gcd(a, b) * b;
16 }
17 
18 int toNum(string s)
19 {
20     int n = s.length();
21     int res = 0;
22     for (int i = 0; i < n; i++)
23     {
24         res += s[i] - '0';
25         if (i != n - 1)
26             res *= 10;
27     }
28     return res;
29 }
30 
31 int main()
32 {
33     string s;
34     while (cin >> s, s != "0")
35     {
36         s = s.substr(2, s.length() - 5);
37         int n = s.length();
38         int minn = INF;
39         int minm = 0;
40         for (int i = 0; i < n; i++)
41         {
42             int x = toNum(s.substr(i, n - i));
43             int y = 9;
44             for (int j = 0; j < n - i - 1; j++)
45             {
46                 y *= 10;
47                 y += 9;
48             }
49             for (int j = 0; j < i; j++)
50             {
51                 y *= 10;
52             }
53             int p = toNum(s.substr(0, i));
54             int q = 1;
55             for (int j = 0; j < i; j++)
56             {
57                 q *= 10;
58             }
59             int l = lcm(y, q);
60             int tmp = l / y * x + l / q * p;
61             int g = gcd(tmp, l);
62             tmp /= g;
63             l /= g;
64             if (l < minn)
65             {
66                 minn = l;
67                 minm = tmp;
68             }
69         }
70         cout << minm << "/" << minn << endl;
71     }
72     return 0;
73 }

 

相关文章:

  • 2022-12-23
  • 2021-09-21
  • 2022-12-23
  • 2021-05-29
  • 2021-08-16
  • 2022-01-08
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-09-12
  • 2022-01-18
  • 2022-12-23
  • 2021-12-13
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案