题目链接 HDU 1717 小数化分数2.
题目:
分析:
其实就是对循环小数进行处理
我将括号作为分界线,如图示:
然后分三种情况:
- 没有循环小数 == 只有左值==
- 循环小数直接在小数点后边 == 只有右值==
- 循环小数与小数点之间有间隔 == 两值都有==
对于第一种情况
ans = 左值/10^n
对于第二种情况
纯循环小数:
一个循环节有几个数,分母就有几个9,
分子则为一个循环节上的数
例.0.3=3/9,0.347=347/999
则:ans = 右值/99…99;
对于第三种情况
混循环小数,
循环节有几个数,分母就有几个9,
不循环的有几个数,分母再添几个0,
分子是从不循环到一个循环节数减去不循环的数
例.0.32=(32-3)/90,0.2134=(2134-21)/9900
则:ans = 左值/10^n + 右值/99…99;
AC代码
import java.util.Scanner;
public class T1717 {
public static long gcd(long m,long n){
if(n==0)return m;
else return gcd(n,m%n);
}
public static void margin(long a,long b,long x,long y){
long bb=b;
a*=y;b*=y;
x*=bb;
a+=x;
long t=gcd(a,b);
left=(a/t);
right=(b/t);
}
public static long left=0;
public static long right=0;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int t=sc.nextInt();
while(t-->0){
String s=sc.next();
char []c=s.toCharArray();
boolean flag=false;
long left_z=0;
long left_m=1;
long right_z=0;
long right_m=9;
int len=c.length;
int index=0;
for(int i=2;i<len;i++){
if(c[i]=='('||c[i]==')'){
if(c[i]=='(') index=i-1;
flag=true;
continue;
}
if(!flag){
left_z*=10;
left_z+=(c[i]-'0');
left_m*=10;
}else{
right_z*=10;
right_z+=(c[i]-'0');
right_m*=10;
right_m+=9;
}
}
right_m=right_m>10?(right_m/10):1;
while(index-->1){
right_m*=10;
}
long a=gcd(left_z,left_m);
left_z/=a;
left_m/=a;
long b=gcd(right_z,right_m);
right_z/=b;
right_m/=b;
margin(left_z,left_m,right_z,right_m);
System.out.println(left+"/"+right);
}
}
}