题目链接:HDOJ1717
小数化分数2
Problem Description:
Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢?
请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。
Input:
第一行是一个整数N,表示有多少组数据。
每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。
Output:
对每一个对应的小数化成最简分数后输出,占一行。
Sample Input:
3
0.(4)
0.5
0.32(692307)
Sample Output:
4/9
1/2
17/52
刚看到题目时以为这道题会很简单,但到了循环小数转换为分数时,发现自己没有一点思路。于是参考了一些大佬的文章循环小数转分数
日本野口哲典在《天哪!数学原来可以这样学》中介绍了如何将循环小数转化成分数的方法,现介绍如下:
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.
附上AC代码
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner cin=new Scanner(System.in);
int n=cin.nextInt();
while(n-->0) {
String s=cin.next();
if(!s.contains("(")) {
String t=s.substring(s.indexOf('.')+1);
int f=t.length();
int tt=Integer.parseInt(t);
int ff=(int)Math.pow(10, f);
int res=gcd(tt,ff);
tt/=res;
ff/=res;
System.out.println(tt+"/"+ff);
}else if(s.charAt(2)=='('){
int start=s.indexOf("(");
int end=s.indexOf(")");
String tt=s.substring(start+1, end);
int ff=tt.length();
int nn=0;
for(int i=0;i<ff;i++) {
nn=nn*10+9;
}
int ttt=Integer.parseInt(tt);
int res=gcd(ttt,nn);
ttt/=res;
nn/=res;
System.out.println(ttt+"/"+nn);
}else if(s.charAt(2)!='(') {
int start=s.indexOf("(");
int end=s.indexOf(")");
String tt=s.substring(start+1, end);
int ff=tt.length();
int nn=0;
for(int i=0;i<ff;i++) {
nn=nn*10+9;
}
int ttt=Integer.parseInt(tt);
StringBuilder str=new StringBuilder();
for(int i=2;i<start;i++) {
str.append(s.charAt(i));
}
int length=str.toString().length();
int t=Integer.parseInt(str.toString());
t=t*nn+ttt;
nn=nn*(int)Math.pow(10, length);
int res1=gcd(t,nn);
t/=res1;
nn/=res1;
System.out.println(t+"/"+nn);
}
}
}
public static int gcd(int m,int n) {
return m%n==0?n:gcd(n,m%n);
}
}
我变量命名的非常乱,估计大家也看不懂,我只是写给自己看的
这道题单从模拟的角度来说并不难,难点就在于模拟和数学之间的结合,循环小数化分数这一点很重要!!如果去掉在网上查资料的时间,那么这道题只用了不到半个小时,但查资料的时间就占了大半,不愧是模拟题啊!