HDU 1717 小数化分数2 循环小数处理 数学

题目链接 HDU 1717 小数化分数2.

题目:

在这里插入图片描述

分析:

其实就是对循环小数进行处理

我将括号作为分界线,如图示:

在这里插入图片描述

然后分三种情况:
  1. 没有循环小数 == 只有左值==
  2. 循环小数直接在小数点后边 == 只有右值==
  3. 循环小数与小数点之间有间隔 == 两值都有==
对于第一种情况

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);
		}
	}
}

发布了79 篇原创文章 · 获赞 45 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43652327/article/details/104341077