小数化分数2

Description

Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢? 
请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。 
 

Input

第一行是一个整数N,表示有多少组数据。 
每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。 
 

Output

对每一个对应的小数化成最简分数后输出,占一行。
 

Sample Input

    
    
3 0.(4) 0.5 0.32(692307)
 

Sample Output

    
    
4/9 1/2

17/52

x=0.34(59)

即100x=34.(59)          (1)

10000x=3459.(59)     (2)

(2)-(1),得9900x=3459-34, => x=(3459-34)/9900,记要要化简!

2.纯循环小数,如0.(4),表示0.444......,对于纯循环小数:

分母:循环节由几位数字组成就有多少个9,例如,0.(45),循环节为45,即分母为99;

分子:循环节数字,如0.(45),分子为45

约分化简即可

3.混循环小数,如0.3(4),表示0.3444.......:

分母:首先循环节有多少个数字就有多少个9,未参与循环的小数部分数字个数有几个,就在后面加几个0,如0.345(343),循环节数字个数为3,未参与循环的小数部分为345,所以分母为999000;

分子:如0.345(343),由未参与循环的小数部分加上第一个循环节的小数部分组成的数345343,减去未参与循环的小数部分组成的数字345,得到344998;

#include <iostream>
#include <math.h>
using namespace std;
int gcd(int a,int b)
{
    if(b==0)return a;
    else return gcd(b,a%b);
}
int st(int n)
{
    int sum=1;
    for(int i=1;i<=n;i++)
	sum=sum*10;
    return sum;
}
int main()
{
    int t;
    cin>>t;
    string a;
    while(t--)
    {
         cin>>a;
         int len=a.length();
         int sum1=0,sum2=0;
         int h1=0,h2=0;
         int flag=0;
         for(int i=2;i<len;i++)
         {
             if(a[i]=='('||a[i]==')')
             {
                 flag=1;
                 continue;
             }
             if(flag)
             {
                sum2=sum2*10+(a[i]-'0');
                h2++;
              }
             else
             {
                sum1=sum1*10+(a[i]-'0');
                h1++;
             }
        }
        long long x1,x2,x3;
         if(h2==0)
         {
             x1=sum1;
             x2=st(h1);
         }
         else
         {
            x1=sum2+(st(h2)-1)*sum1;
            x2=st(h1)*(st(h2)-1);
         }
          x3=gcd(x1,x2);
          x1=x1/x3;
          x2=x2/x3;
          cout<<x1<<"/"<<x2<<endl;
    }
    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值