思路:
循环小数化分数,枚举所有可能的循环节,取分母最小的那个。
实现:
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 }