|
Problem Description Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢?
|
|
Input 第一行是一个整数N,表示有多少组数据。
|
|
Output 对每一个对应的小数化成最简分数后输出,占一行。
|
|
Sample Input
|
|
Sample Output
|
题解:不循环小数化分数很简单,现在这里介绍循环小数化分数的方法,
日本野口哲典在《天哪!数学原来可以这样学》中介绍了如何将循环小数转化成分数的方法,现介绍如下:
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
2.把0.1234123412341234...化成分数 .
设X=0.1234123412341234...
因为0.1234123412341234... == 0.1234 + 0.000012341234...
所以X = 0.1234 + 0.0001X
解得:X = 1234/9999
3.把0.56787878...化成分数,
因为0.56787878...= 0.56 + 0.01 * 0.787878...
所以设X=0.787878...则X=0.78 + 0.01X
所以X = 78/99
所以原小数0.56787878...=0.56+ 0.01X = 0.56 + 0.078/99 = 2811/4950
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
#define Max int(5e5+10)
int gcd(int n,int m)
{
return m==0?n:gcd(m,n%m);
}
int main()
{
int t,fenzi,fenmu,len1,len2,num1,i,j,num2;
char s[20],snum[20];
scanf("%d",&t);
while(t--)
{
scanf("%s",&s);
len1=1;
len2=1;
for(i=2;s[i]!='('&&s[i]!='\0';i++)
{
len1*=10;
snum[i-2]=s[i];
}
snum[i-2]='\0';
if(strlen(snum)==0) num1=0;
else
sscanf(snum,"%d",&num1);
if(s[i]=='(')
{
for(i++;s[i]!=')';i++)
{
snum[i-3]=s[i];
len2*=10;
}
snum[i-3]='\0';
sscanf(snum,"%d",&num2);
fenzi=num2-num1;
fenmu=len1*len2-len1;
int value=gcd(fenmu,fenzi);
printf("%d/%d\n",fenzi/value,fenmu/value);
}
else
{
fenzi=num1;
fenmu=len1;
int value=gcd(len1,num1);
printf("%d/%d\n",fenzi/value,fenmu/value);
}
}
return 0;
}

652

被折叠的 条评论
为什么被折叠?



