Rational Ratio(一道思维题)

Rational Ratio

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;

}
原文地址:https://www.cnblogs.com/lifehappy/p/12810565.html