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 \times 10 = 1234.56 = 123456 + x\)
通过上面的步骤我们得到 \(99x = 56\)\(1234.56 = \frac{1234 \times 99 + 56} {99} = \frac{122222}{99}\)
所以原式 \(123.456 = \frac{1234.56}{10} = \frac{122222}{99 \times 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\n", b / d, c / d);
    return 0;

}
posted @ 2020-04-30 18:17  lifehappy  阅读(177)  评论(0编辑  收藏  举报