• CSU 8月月赛 Decimal 小数化分数


    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1303 这个OJ很容易跪所以我贴一下题目

    Description

    任意一个分数都是有理数,对于任意一个有限小数,我们都可以表示成一个无限循环小数的形式(在其末尾添加0),对于任意一个无限循环小数都可以转化成一个分数。现在你的任务就是将任意一个无限循环小数转化成既约分数形式。所谓既约分数表示,分子和分母的最大公约数是1。

    Input

    有多组数据。

    每组数据一行。输入为0.a1a2a3...ak(b1b2...bm)的形式,其中a1a2a3...ak为非循环部分,(b1b2b3..bm)为循环部分。数据保证非循环部分的长度k和循环部分的长度m不会超过8.

    Output

    对于每组测试数据输出A/B,其中A是分子,B是分母,A,B均为整数。

    Sample Input

    0.0(714285)
    0.0(5)
    0.9(671)

    Sample Output

    1/14
    1/18
    4831/4995
     
    其实就是无限小数化分数 推一下发现对于0.abc(def)这样的小数
    我们可以对其放大10^n倍
    变成abc.(def)
    再放大10^m倍
    变成abcdef.(def)
    然后令原数为X , 两式相减 
    得到方程(10^(n+m)-10^n) * X = (abcdef-abc)
    求GCD化简即可...
     
    PS : 我用系统pow(10,2)竟然会得到99...浮点数靠不住啊...结果自己写了一个...
     

    /********************* Template ************************/
    #include <set>
    #include <map>
    #include <list>
    #include <cmath>
    #include <ctime>
    #include <deque>
    #include <queue>
    #include <stack>
    #include <bitset>
    #include <cstdio>
    #include <string>
    #include <vector>
    #include <cassert>
    #include <cstdlib>
    #include <cstring>
    #include <sstream>
    #include <fstream>
    #include <numeric>
    #include <iomanip>
    #include <iostream>
    #include <algorithm>
    #include <functional>
    using namespace std;
    
    #define EPS         1e-8
    #define MAXN        3000
    #define MOD         (int)1e9+7
    #define PI          acos(-1.0)
    #define INF         0x7fffffff
    #define max(a,b)    ((a) > (b) ? (a) : (b))
    #define min(a,b)    ((a) < (b) ? (a) : (b))
    #define max3(a,b,c) (max(max(a,b),c))
    #define min3(a,b,c) (min(min(a,b),c))
    #define BUG         cout<<"BUG! "<<endl
    #define LINE        cout<<"------------------"<<endl
    #define L(t)        (t << 1)
    #define R(t)        (t << 1 | 1)
    #define Mid(a,b)    ((a + b) >> 1)
    #define lowbit(a)   (a & -a)
    #define FIN         freopen("in.txt","r",stdin)
    #pragma comment     (linker,"/STACK:102400000,102400000")
    
    typedef long long LL;
    // typedef unsigned long long ULL;
    // typedef __int64 LL;
    // typedef unisigned __int64 ULL;
    LL gcd(LL a,LL b){ return b?gcd(b,a%b):a; }
    //int lcm(int a,int b){ return a*b/gcd(a,b); }
    
    /*********************   F   ************************/
    LL mpow(int a,int b){
        LL ans = 1;
        for(int i = 0 ; i < b ; i++){
            ans *= a;
        }
        return ans;
    }
    char a[MAXN];
    int main(){
        while(gets(a)){
            int len = strlen(a);
            int i;
            for(i = 0 ; i < len ; i++)
                if(a[i] == '.') break;
            LL num = 0;
            int cnt1 = 0;
            for(i = i+1 ; i < len ; i++){
                if(a[i] == '(') break;
                num = num*10 + (a[i]-'0');
                cnt1++;
            }
            LL num2 = 0;
            int cnt2 = 0;
            for(i = i+1 ; i < len ; i++){
                if(a[i] == ')') break;
                num2 = num2*10 + (a[i]-'0');
                cnt2++;
            }
            LL p,q;
            if(cnt2 == 0){
                LL r1 = num;
                LL r2 = mpow(10,cnt1);
                p = r1/gcd(r1,r2);
                q = r2/gcd(r1,r2);
            }else{
                LL r1 = mpow(10,cnt1+cnt2) - mpow(10,cnt1);
                LL r2 = num*mpow(10,cnt2)+num2 - num;
                p = r2/gcd(r1,r2);
                q = r1/gcd(r1,r2);
            }
            cout<<p<<"/"<<q<<endl;
    
        }
        return 0;
    }
     
  • 相关阅读:
    技术债务墙:一种让技术债务可见并可协商的方法
    墙裂推荐
    shell 脚本通过Webhook 发送消息到微信群
    关于中医的一段对话 [ZZ] -- 思维训练故事
    应用深度神经网络预测学生期末成绩
    Python中的模块引用机制
    批量修改含空格的文件名「Linux」
    Markdown数学公式语法
    批处理修改IP
    FTD团队目录
  • 原文地址:https://www.cnblogs.com/Felix-F/p/3293322.html
Copyright © 2020-2023  润新知