166. 分数到小数(模拟)

166. 分数到小数

-1 
-2147483648

千算万算,没想到有这个样例…

int的取值范围-231——231-1,也就是-2147483648——2147483647,输入并不越界,中间计算的时候就溢出了,要进行类型转换处理。

还有一个点就是哈希表中存的是当前字符串的长度,便于出现循环节时,将左括号插入到字符串中。

改之前的代码(溢出):

class Solution {
	public String fractionToDecimal(int numerator, int denominator) {
		// 分子是0
		if (numerator == 0)
			return "0";
		
		StringBuffer res = new StringBuffer();
		
		// 正负,如果异号,添符号,并且将分子,分母全部变成正数
		if (numerator * denominator < 0) {
			res.append("-");
			numerator = Math.abs(numerator);
			denominator = Math.abs(denominator);
		}			
		
		int quotient = numerator / denominator;	 //商
		int rem = numerator % denominator;		 //余数
		
		if (rem == 0) { // 能整除,是个整数
			
			res.append(quotient);
			return res.toString();
			
		} else { // 小数
			res.append(quotient);
			res.append(".");
			// 下面开始处理小数部分
			HashMap<Integer, Integer> hs = new HashMap<>();
			int divisor = denominator; // 除数,一直就是分母,不会变
			while (rem != 0) {
				if(hs.containsKey(rem)) {	//如果余数再次出现,循环节就确定了
					res.insert(hs.get(rem), "(");
					res.append(")");
					break;
				}
				hs.put(rem, res.length());
				rem *= 10;
				res.append(String.valueOf(rem/divisor));
				rem %= divisor;
			}
		}
		return res.toString();
	}
}

官方代码

官方题解

起的变量名讲究,这代码跟书法一样,真好看…

public String fractionToDecimal(int numerator, int denominator) {
    if (numerator == 0) {
        return "0";
    }
    StringBuilder fraction = new StringBuilder();
    // If either one is negative (not both)
    if (numerator < 0 ^ denominator < 0) {
        fraction.append("-");
    }
    // Convert to Long or else abs(-2147483648) overflows
    long dividend = Math.abs(Long.valueOf(numerator));
    long divisor = Math.abs(Long.valueOf(denominator));
    fraction.append(String.valueOf(dividend / divisor));
    long remainder = dividend % divisor;
    if (remainder == 0) {
        return fraction.toString();
    }
    fraction.append(".");
    Map<Long, Integer> map = new HashMap<>();
    while (remainder != 0) {
        if (map.containsKey(remainder)) {
            fraction.insert(map.get(remainder), "(");
            fraction.append(")");
            break;
        }
        map.put(remainder, fraction.length());
        remainder *= 10;
        fraction.append(String.valueOf(remainder / divisor));
        remainder %= divisor;
    }
    return fraction.toString();
}
发布了56 篇原创文章 · 获赞 4 · 访问量 1675

猜你喜欢

转载自blog.csdn.net/qq_41342326/article/details/104262898