import java.util.*;
/**
* NC351 分数到小数
* @author d3y1
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param n int整型
* @param m int整型
* @return string字符串
*/
public String frac2Dec (int n, int m) {
// return solution1(n, m);
return solution2(n, m);
}
/**
* 哈希
* @param n
* @param m
* @return
*/
private String solution1(int n, int m){
if(n == 0){
return "0";
}
HashMap<String,Integer> map = new HashMap<>();
// 分子
long numerator = n;
// 分母
long denominator = m;
StringBuilder sb = new StringBuilder();
// 2147483647 -> 01111111111111111111111111111111 (32位)
// -2147483648 -> 10000000000000000000000000000000 (32位)
// 2147483647^-2147483648 -> 11111111111111111111111111111111 (32位)
// System.out.println(Integer.toBinaryString(2147483647));
// System.out.println(Integer.toBinaryString(-2147483648));
// System.out.println(Integer.toBinaryString(2147483647^-2147483648));
// 符号位
long sign = (numerator)^(denominator);
if(sign < 0){
sb.append("-");
}
numerator = Math.abs(numerator);
denominator = Math.abs(denominator);
// 整数部分
long intPart = numerator/denominator;
sb.append(intPart);
long remain = numerator%denominator;
// 可整除
if(remain == 0){
return sb.toString();
}
// 不可整除 加小数点
sb.append(".");
String key;
// 小数部分
long decPart;
do{
key = remain +"/"+ denominator;
// 循环小数
if(map.containsKey(key)){
int idx = map.get(key);
sb.insert(idx, "(");
sb.append(")");
break;
}
map.put(key, sb.length());
numerator = remain*10;
decPart = numerator/denominator;
sb.append(decPart);
remain = numerator%denominator;
}while(remain != 0);
return sb.toString();
}
/**
* 哈希
* @param n
* @param m
* @return
*/
private String solution2(int n, int m){
if(n == 0){
return "0";
}
HashMap<Long,Integer> map = new HashMap<>();
// 分子
long numerator = n;
// 分母
long denominator = m;
StringBuilder sb = new StringBuilder();
// 符号位
long sign = (numerator)^(denominator);
if(sign < 0){
sb.append("-");
}
numerator = Math.abs(numerator);
denominator = Math.abs(denominator);
// 整数部分
long intPart = numerator/denominator;
sb.append(intPart);
long remain = numerator%denominator;
// 可整除
if(remain == 0){
return sb.toString();
}
// 不可整除 加小数点
sb.append(".");
Long key;
// 小数部分
long decPart;
do{
// 可直接将分子作为key
key = remain;
// 循环小数
if(map.containsKey(key)){
int idx = map.get(key);
sb.insert(idx, "(");
sb.append(")");
break;
}
map.put(key, sb.length());
numerator = remain*10;
decPart = numerator/denominator;
sb.append(decPart);
remain = numerator%denominator;
}while(remain != 0);
return sb.toString();
}
}