小数化分数

中南大学2013年8月31日 月赛

题意:小数化既约分数形式,这道题应该来自编程之美的《浮点数的精确表示》,相当于解题报告。

在这里我就不赘述了。

1.如果没有循环节或者循环节为0

       X=0.a1a2a3...an(0000)

      10^n*X=a1a2a3...an;

那么求最大公约数即可。

2.如果带有非0的循环节
      X=0.a1a2a3...an(b1b2...bm)
     10^n*X=a1a2a3...an.(b1b2...bm);

这里令Y=0.(b1b2...bm),a=a1a2a3...an,b=b1b2...bm

Y*10^m-b=Y;故Y=b/(10^m-1);

那么 X=(a*(10^m-1)+b) / 10^n*(10^m-1);

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
#define LL long long

LL a,b,basea,baseb;
void split(char str[])
{
    int i=2;
    a=b=0;
    basea=baseb=1;
    while(str[i]&&str[i]!='(')
    {
        a=a*10+(str[i]-'0');
        i++;
        basea*=10;
    }
    if(str[i]=='(')i++;
    while(str[i]&&str[i]!=')')
    {
        b=b*10+(str[i]-'0');
        i++;
        baseb*=10;
    }
}
LL GCD(LL n,LL m)
{
    return  m?GCD(m,n%m):n;
}
int main()
{
    char str[30];
    LL n,m;
    while(~scanf("%s",str))
    {
        split(str);
       /* if(a==0&&b==0)
        {
            printf("0\n");
            continue;
        }
        */
      //  (a*(baseb-1)+b)/basea*(baseb-1);
       if(b==0)//存在循环节为0的情况
        {
              n=a;
              m=basea;
        }
        else
        {
            n=a*(baseb-1)+b;
            m=basea*(baseb-1);
        }
        LL key=GCD(n,m);
       cout<<n/key<<"/"<<m/key<<endl;
    }
    return 0;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值