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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王跃坤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值