小数化分数(hdu 1717)

1.首先看循环小数0.7272……循环节为7,2两位,因此化为分数为72/99=1/8.即有几位循环数字就除以几个9。又如0.123123……循环节为1,2,3三位,因此化为分数为123/999=41/333.这种方法只适用于从小数点后第一位就开始循环的小数,如果不是从第一位就开始循环的小数,必须用下面的方法。
 2.循环小数0.41666……先把0.41666……乘以100得41.666……,可以理解为41+0.666……,所以写成分数为
41+6/9=41+2/3=125/3.因为开始乘以了100,所以再除以100,即125/3÷100=125/300=5/12.
证明如下:
1.把0.232323... 化成分数 . 
设X=0.232323... 
因为0.232323... == 0.23 + 0.002323... 
所以 X = 0.23 + 0.01X 
解得:X = 23/99 
相关例题:hdu1717   poj1930

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

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

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

Sample Input
 
 
30.(4)0.50.32(692307)
 
Sample Output

4/9

1/2

17/52

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>

using namespace std;

char str[20];

int gcd(int minn,int maxn)
{
    return minn==0?maxn:gcd(maxn%minn,minn);
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        scanf("%s",str);
        int len=strlen(str);
        if(!strchr(str,'(')){//没有循环节
            int cnt=0,num=1;
            for(int i=len-1;i>1;i--){
                cnt+=(str[i]-'0')*pow(10.0,(len-i-1)*1.0);
                num*=10;
            }
            int res=gcd(num,cnt);
            num/=res;
            cnt/=res;
            printf("%d/%d\n",cnt,num);
        }else{//有循环节
            int cnt=0,num=0;
            int book=strchr(str,'(')-str;
            for(int i=book+1;i<len-1;i++){
                cnt=cnt*10+str[i]-'0';
                num=num*10+9;
            }
            int res=gcd(num,cnt);
            cnt/=res;
            num/=res;
            int inter=0;
            for(int i=2;i<book;i++){
                inter=inter*10+str[i]-'0';
            }
            cnt+=inter*num;
            for(int i=2;i<book;i++){//增大了相应的倍数,就要减少相应的倍数
                num*=10;
            }
            res=gcd(num,cnt);
            num/=res;
            cnt/=res;
            printf("%d/%d\n",cnt,num);
        }
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值