JAVA-获取无限循环小数的循环节

61 篇文章 3 订阅

算法思路

  • 定理:一个分母为N的循环小数的循环节位数最多不超过N-1位
  • 若A/B为无限循环小数的话,则在出现循环节之前,每次长除法的余数都不相同

代码

/**
* @param a 分子
* @param b 分母
* @return  返回代表循环节的字符串
*/
static String getRepetend(int a,int b){
	String decimal ="";
	List<Integer> temp = new LinkedList<Integer>();
	a = a%b;
	loop:
	while(a!=0){
		if(!temp.contains(a))	temp.add(a);
		else
			for(int i=0;i<temp.size();i++)
				if(temp.get(i)==a) {
					decimal = decimal.substring(i,decimal.length());
					break loop;
				}
		decimal += a*10/b;
		a = (a*10)%b;
	}
	return decimal;
}

算法例子

参考:https://programtip.com/zh/art-111488
给定分子a,分母b,若a除以b为无限循环小数,则输出格式为整数部分.小数部分[循环节],例如1.03333333输出格式为1.0[3],若是有限小数,则输出不带后缀零的结果,例如1.25输出格式为1.25
代码

import java.util.LinkedList;
import java.util.List;
public class test {
	
	static String getResult(int a,int b){
		if(a%b==0)	return String.valueOf(a/b);
		String decimal ="";
		List<Integer> temp = new LinkedList<Integer>();
		a = a%b;
		loop:
		while(a!=0){
			if(!temp.contains(a))	temp.add(a);
			else
				for(int i=0;i<temp.size();i++)
					if(temp.get(i)==a) {
						decimal = decimal.substring(0,i)+"["+decimal.substring(i,decimal.length())+"]";
						break loop;
					}
			decimal += a*10/b;
			a = (a*10)%b;
		}
		return String.valueOf(a/b)+"."+decimal;
	}
	
	public static void main(String[] args) {
		for(int i=1; i<=20; i++)
			System.out.println(getResult(1,i));
	}
}

结果

1
0.5
0.[3]
0.25
0.2
0.1[6]
0.[142857]
0.125
0.[1]
0.1
0.[09]
0.08[3]
0.[076923]
0.0[714285]
0.0[6]
0.0625
0.[0588235294117647]
0.0[5]
0.[052631578947368421]
0.05
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,由于浮点数的精度问题,可能会出现无限循环小数。对于这种情况,可以使用BigDecimal类来处理。 BigDecimal类可以表示任意精度的十进制数,它可以处理大于64位的整数和小数。在使用BigDecimal类时,需要注意以下几点: 1. 使用BigDecimal类时,应该使用其构造方法来初始化BigDecimal对象,而不是使用double类型的值来初始化。 例如: ``` BigDecimal bd = new BigDecimal("0.1"); ``` 2. 在进行浮点数运算时,应该使用BigDecimal类提供的方法,而不是使用double类型的运算符。 例如: ``` BigDecimal a = new BigDecimal("0.1"); BigDecimal b = new BigDecimal("0.2"); BigDecimal c = a.add(b); ``` 3. 在比较两个BigDecimal对象的值时,应该使用compareTo()方法,而不是使用等于(==)或不等于(!=)运算符。 例如: ``` BigDecimal a = new BigDecimal("0.1"); BigDecimal b = new BigDecimal("0.2"); if (a.compareTo(b) < 0) { System.out.println("a < b"); } else if (a.compareTo(b) > 0) { System.out.println("a > b"); } else { System.out.println("a = b"); } ``` 关于java无限循环小数判定问题,可以通过以下代码来解决: ``` public static boolean isRepeatingDecimal(BigDecimal num) { BigDecimal[] arr = num.divideAndRemainder(BigDecimal.ONE); BigDecimal decimalPart = arr[1]; String decimalStr = decimalPart.toString().substring(2); // 去掉小数点和整数部分 if (decimalStr.length() < 2) { return false; // 小数部分长度小于2,不可能循环 } int halfLength = decimalStr.length() / 2; for (int i = 1; i <= halfLength; i++) { String str = decimalStr.substring(0, i); if (decimalStr.matches("^(" + str + ")+(.*)" + str + "$")) { return true; // 存在循环 } } return false; // 不存在循环 } ``` 该方法接收一个BigDecimal对象,判断其是否为无限循环小数,返回true或false。 以上是关于Java中处理无限循环小数的基础知识和方法介绍,希望能对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值