小数换分数

思路:

有限小数:直接化。

循环小数:循环节的位数为X、数值为b,非循环节的位数为Y。整体小数部分是数值为a(尽包含一个循环节),分子为a-b,分母为X个9,Y个0。

I - 窗鸣败纸,尚惊疑、打篷干雪。

  HDU - 1717 

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

Input
第一行是一个整数N,表示有多少组数据。 
每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。 
Output
对每一个对应的小数化成最简分数后输出,占一行。
Sample Input
3
0.(4)
0.5
0.32(692307)
Sample Output
4/9
1/2
17/52

废话不多说直接上代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <math.h>
using namespace std;

int gcd(int a,int b){
    int r;
    while(b>0){
        r=a%b;
        a=b;b=r;
        
    }
    
    return a;
}


void get(string a){
    int l=a.find('(');
    if(l!=-1);
    else {
        int len=a.length();
        int fenzi=0;
        fenzi=a[2]-'0';
        for(int i=3;i<len;i++){
            fenzi=fenzi*10+a[i]-'0';
        }
        int shu;
        long long int w=1;
        shu=gcd(fenzi,pow(10,len-2));
        for(int i=0;i<len-2;i++)
            w*=10;
        printf("%d/%lld\n",fenzi/shu,w/shu);
        
    }
    
}

void out(string a){
    int l=a.find('(');
    if(l==-1);
    else{
        int fenmu=9,fenzi=0,s=0,x=0;
        int len=a.length();
        if(l>=3)
            fenzi=a[2]-'0',s++;
        
        for(int i=3;i<l;i++){
            fenzi=fenzi*10+a[i]-'0';
            s++;
            
        }
        x=fenzi;
        /*if(a[l]=='('&&a[l+1]=='0'&&a[l+2]==')');
        else*/
        for(int i=l+1;i<len-1;i++){
            fenzi=fenzi*10+a[i]-'0';
            if(i<len-2)
                fenmu=fenmu*10+9;
        }
        
        for(int i=0;i<s;i++)
            fenmu*=10;
        
        int shu;
        fenzi-=x;
        
        shu=gcd(fenzi,fenmu);
        printf("%d/%d\n",fenzi/shu,fenmu/shu);
       
    }   
}

int main(){
    int t;
    string a;
    scanf("%d",&t);
    while(t--){
        cin>>a;
        get(a);
        out(a);
        
        
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值