/* 有理循环小数
1/7= 0.142857142... 是个无限循环小数。
任何有理数都可以表示为无限循环小数的形式。
本题目要求即是:给出一个数字的循环小数表示法。
例如:
输入:
1,5
则输出:
0.2
输入:
1,7
则输出:
0.[142857]
输入:
7,6
则输出:
1.1[6]
用户输入的格式是:
整数,整数
每个整数范围均为:1~1000
程序输出两个整数做除法产生的小数或无限循环小数(循环节用方括号括起)。
思路:(一定要先看思路再看代码)
一开始安装我们手算的逻辑,去找循环节。什么是循环节?
拿1 除以7
虽然画的有点丑。
在上述实例中,余数再次计算出 10 的时候,10再次不停的除以7,肯定是一个循环。
这个 10 就是循环节。
自己可以去试试,用这种方式找找感觉。比如使用 7 除以 6 。
代码核心。整数部分先计算出来
小数部分使用一个BufferString 字符串类依次存放
使用一个 hashMap
他的key 存放 每次计算出来的余数, value 存放,这个余数计算后 插入 String 的坐标。
import java.io.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String[] in = input.next().split(",");
int n = Integer.parseInt(in[0]);
int m = Integer.parseInt(in[1]);
String entity = String.valueOf(n/m);//保存下整数部分。
StringBuffer res = new StringBuffer();//保存小数部分
Map<Integer,Integer> set = new HashMap<Integer, Integer>();//key:余数,value:在小数部分的坐标
//模拟手算
int mod = n%m;
int index=0;
while(mod!=0){
n=mod*10;
if(!set.containsKey(n)){
set.put(n,index++);
res.append(n/m);
n = n%m;
mod = n%m;
}else{
res.insert(set.get(n),"[");
res.insert(index+1,"]");
break;
}
}
//模拟结束
entity = entity +"."+res.toString();
System.out.println(entity);
}
}