Rational Ratio
思路
比赛的时候我被这道题给折磨了,说来还是太菜了。
对样例 (0.142857 6) 我们的做法是,取循环节 (0.142857 = x),然后我们对其左右乘以 (10^ {6}) 得到 (1000000x = 142857.142857),我们同时把循环节给减去
得到 (99999x = 142857) 然后得到 (x = frac{142856} {99999})求一个最大公约数,然后再约去就得到了答案(frac{1}{7})。
对样例 (123.456 2) 分析,首先我们对 (123.456 imes 10 = 1234.56 = 123456 + x),
通过上面的步骤我们得到 (99x = 56),(1234.56 = frac{1234 imes 99 + 56} {99} = frac{122222}{99})。
所以原式 (123.456 = frac{1234.56}{10} = frac{122222}{99 imes 10}),再求一个公因数就可以得到答案了。
这两个样例理解了自然就明白如何做了吧,关键就是要找 (x),接下来的就好写了。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b) {
return b ? gcd(b, a % b) : a;
}
int main() {
// freopen("in.txt", "r", stdin);
string str;
int l;
cin >> str >> l;
int n = str.size();
ll a = 0, b = 0;
int pos;
for(int i = 0; i < n - l; i++) {
if(str[i] != '.')
a = a * 10 + str[i] - '0';
else pos = i;
}
for(int i = n - l; i < n; i++)
b = b * 10 + str[i] - '0';
ll c = pow((ll)10, l) - 1;
b += c * a;
c *= pow((ll)10, n - l - pos - 1);
ll d = gcd(b, c);
// cout << b << c << endl;
printf("%lld/%lld
", b / d, c / d);
return 0;
}