HDOJ1717 小数化分数2 (JAVA实现,模拟+数学)

题目链接: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);
	}
}

我变量命名的非常乱,估计大家也看不懂,我只是写给自己看的

这道题单从模拟的角度来说并不难,难点就在于模拟和数学之间的结合,循环小数化分数这一点很重要!!如果去掉在网上查资料的时间,那么这道题只用了不到半个小时,但查资料的时间就占了大半,不愧是模拟题啊!

发布了24 篇原创文章 · 获赞 32 · 访问量 1695

猜你喜欢

转载自blog.csdn.net/weixin_45729946/article/details/103989788