[LeetCode] 166. Fraction to Recurring Decimal

来源:互联网 发布:养羊软件 编辑:程序博客网 时间:2024/05/29 02:12

Given two integers representing the numerator and denominator of a fraction, return the fraction in string format.

If the fractional part is repeating, enclose the repeating part in parentheses.

For example,

  • Given numerator = 1, denominator = 2, return "0.5".
  • Given numerator = 2, denominator = 1, return "2".
  • Given numerator = 2, denominator = 3, return "0.(6)".

问题描述:

给定两个整数,分别代表一个分数的分子和分母,以字符串形式返回分数。

如果小数部分有循环节,用括号()将其包裹。

举例来说,

  • 给定,分子 = 1, 分母 = 2, 返回“0.5”
  • 给定,分子 = 2, 分母 = 1, 返回“2”
  • 给定,分子 = 2, 分母 = 3, 返回“0.(6)” 

        if (numerator == 0) return string("0");// 如果分子为0,没有计算的必要了,直接返回0.        string rval(((numerator > 0) ^ (denominator > 0)) ? "-" : "");// 判断结果的正负号,然后将分子分母去绝对值                long num = abs((long)numerator), denom = abs((long)denominator); // 注意,这里有正溢出的可能,所以使用long。        rval.append(to_string(num / denom));// 求整数部分.        num = num % denom;// 以 4 ÷ 3 = 1.3333为例。        if (num == 0) return rval;// 整数部分 = 4 整数除法 3;                unordered_map<long, size_t> repeated;        rval += ".";        while (1) {            num = num * 10;// 对于小数部分的第一位,分子乘以10之后,就会移至整数部分。            if (repeated.count(num)) {// 关键点,如何去判断出现了循环。直接从小数部分去判断,将会比较麻烦。                size_t index = repeated[num];// 小数部分,皆源于num这个变量。如果在循环过程中出现了重复的num值,                rval.insert(index, "(");// 那么之后计算出的小数位必然重复。                rval.append(")");                break;            } else {                repeated[num] = rval.size();                rval += to_string(num / denom);            }            num = num % denom;            if (num == 0) break;        }                return rval;







原创粉丝点击