• 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;
    
    }
    
  • 相关阅读:
    前端开源项目周报0408
    iOS开源项目周报0406
    安卓开源项目周报0405
    iOS开源项目周报0330
    安卓开源项目周报0329
    前端开源项目周报0328
    vue项目搭建
    微信中h5页面用window.history.go(-1)返回上一页页面不会重新加载问题
    h5移动端页面meta标签
    js中break跳出多层循环
  • 原文地址:https://www.cnblogs.com/lifehappy/p/12810565.html
Copyright © 2020-2023  润新知