Leetcode166. Fraction to Recurring Decimal分数到小数

给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以字符串形式返回小数。

如果小数部分为循环小数,则将循环的部分括在括号内。

示例 1:

输入: numerator = 1, denominator = 2 输出: "0.5"

示例 2:

输入: numerator = 2, denominator = 1 输出: "2"

示例 3:

输入: numerator = 2, denominator = 3 输出: "0.(6)"

考验除法的原理。

还有很多需要注意的点。

  class Solution {
  public:
	  string fractionToDecimal(int numerator, int denominator) 
	  {
		  //特殊情况的判断。
		  if (denominator == 0)
			  return "NaN";
		  if (numerator == 0)
			  return "0";
		  //为什么要在里面在加一层long long,因为如果是INT_MIN那么在转换成long long前,就直接爆了。
		  //INT_MIN =  -2147483647 - 1 而INT_MAX = 2147483647;
		  //该题如果不换成longlong,那么在临界值旁会出错。
		  long long n = abs((long long)numerator);
		  long long d = abs((long long)denominator);
		  //
		  bool flag = false;
		  if (numerator > 0 && denominator > 0 || numerator < 0 && denominator < 0)
		  {
			  flag = true;
		  }
		  string intergetPart = to_string(n / d);
		  n %= d;
		  vector<long long> save;
		  string decimalStr = "";
		  while (n != 0)
		  {
			  n *= 10;
			  int i = save.size() - 1;
			  for (; i >= 0; i -- )
			  {
				  //除法的原理就是除不尽的,乘10再除,最后将结果再缩小10倍
				  //如果之前的n有个和现在的n相同的数,那么就肯定是循环了。
				  if (save[i] == n)
					  break;
			  }
			  if (i >= 0)
			  {
				  decimalStr.insert(i, "(");
				  decimalStr += ")";
				  break;
			  }
			  save.push_back(n);
			  decimalStr += to_string(n / d);
			  n %= d;
		  }
		  //还需要注意答案为正还是负
		  return (flag == false ? "-" : "") + intergetPart + (decimalStr == "" ? "" : ("." + decimalStr));
	  }
  };
原文地址:https://www.cnblogs.com/lMonster81/p/10433758.html