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
设X=0.232323...
因为0.232323... == 0.23 + 0.002323...
所以 X = 0.23 + 0.01X
解得:X = 23/99
相关例题:hdu1717 poj1930
Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢?
请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。
请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。
Input
第一行是一个整数N,表示有多少组数据。
每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。
每组数据只有一个纯小数,也就是整数部分为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;
}