小数换分数

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;

[cpp]  view plain  copy
  1. #include <iostream>  
  2. #include <math.h>  
  3. using namespace std;  
  4. int gcd(int a,int b)  
  5. {  
  6.     if(b==0)return a;  
  7.     else return gcd(b,a%b);  
  8. }  
  9. int st(int n)  
  10. {  
  11.     int sum=1;  
  12.     for(int i=1;i<=n;i++)  
  13.     sum=sum*10;  
  14.     return sum;  
  15. }  
  16. int main()  
  17. {  
  18.     int t;  
  19.     cin>>t;  
  20.     string a;  
  21.     while(t--)  
  22.     {  
  23.          cin>>a;  
  24.          int len=a.length();  
  25.          int sum1=0,sum2=0;  
  26.          int h1=0,h2=0;  
  27.          int flag=0;  
  28.          for(int i=2;i<len;i++)  
  29.          {  
  30.              if(a[i]=='('||a[i]==')')  
  31.              {  
  32.                  flag=1;  
  33.                  continue;  
  34.              }  
  35.              if(flag)  
  36.              {  
  37.                 sum2=sum2*10+(a[i]-'0');  
  38.                 h2++;  
  39.               }  
  40.              else  
  41.              {  
  42.                 sum1=sum1*10+(a[i]-'0');  
  43.                 h1++;  
  44.              }  
  45.         }  
  46.         long long x1,x2,x3;  
  47.          if(h2==0)  
  48.          {  
  49.              x1=sum1;  
  50.              x2=st(h1);  
  51.          }  
  52.          else  
  53.          {  
  54.             x1=sum2+(st(h2)-1)*sum1;  
  55.             x2=st(h1)*(st(h2)-1);  
  56.          }  
  57.           x3=gcd(x1,x2);  
  58.           x1=x1/x3;  
  59.           x2=x2/x3;  
  60.           cout<<x1<<"/"<<x2<<endl;  
  61.     }  
  62.     return 0;  
  63. }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值