整数化小数,不循环的小数容易化。对于循环小数化分数原理如下:
⑴ 把0.4747……和0.33……化成分数。
例1: 0.4747……×100=47.4747……
0.4747……×100-0.4747……=47.4747……-0.4747……
(100-1)×0.4747……=47
即99×0.4747…… =47
那么 0.4747……=47/99
例2: 0.33……×10=3.33……
0.33……×10-0.33……=3.33…-0.33……
(10-1) ×0.33……=3
即9×0.33……=3
那么0.33……=3/9=1/3
由此可见, 纯循环小数化分数,它的小数部分可以写成这样的分数:纯循环小数的循环节最少位数是几,分母就是由几个9组成的数;分子是纯循环小数中一个循环节组成的数。
⑵把0.4777……和0.325656……化成分数。
例1:0.4777……×10=4.777……①
0.4777……×100=47.77……②
用②-①即得:
0.4777……×90=47-4
所以, 0.4777……=43/90
例2:0.325656……×100=32.5656……①
0.325656……×10000=3256.56……②
用②-①即得:
0.325656……×9900=3256.5656……-32.5656……
0.325656……×9900=3256-32
所以, 0.325656……=3224/9900
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int gcd(int x,int y)
{
return y?gcd(y,x%y):x;
}
void getans(char *str,int &a,int &b,int strl)
{
int len1=1,i,t1=0;
for(i=2;str[i]!='('&&i<strl;i++){
len1*=10;
t1=t1*10+str[i]-'0';
}
if(str[i]!='('){
int pre=gcd(t1,len1);
t1/=pre;
len1/=pre;
a=t1;b=len1;
return;
}
int len2=len1,t2=t1;
for(i=i+1;str[i]!=')'&&i<strl;i++){
len2*=10;
t2=t2*10+str[i]-'0';
}
a=t2-t1;
b=len2-len1;
int pre=gcd(a,b);
a/=pre;
b/=pre;
}
int main()
{
int n;cin>>n;
while(n--)
{
char ch[100];int a,b;
scanf("%s",ch);
getans(ch,a,b,strlen(ch));
printf("%d/%d\n",a,b);
}
}
Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢?
请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。
Input
第一行是一个整数N,表示有多少组数据。
每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。
Output
对每一个对应的小数化成最简分数后输出,占一行。
Sample Input
3
0.(4)
0.5
0.32(692307)
Sample Output
4/9
1/2
17/52