思路:
有限小数:直接化。
循环小数:循环节的位数为X、数值为b,非循环节的位数为Y。整体小数部分是数值为a(尽包含一个循环节),分子为a-b,分母为X个9,Y个0。
I - 窗鸣败纸,尚惊疑、打篷干雪。
HDU - 1717 Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢?
请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。
Input
每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。
3 0.(4) 0.5 0.32(692307)
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;
}