LeetCode-Fraction to Recurring Decimal-解题报告

本文介绍了一种将分数转换为循环小数字符串的方法,并通过模拟除法过程来检测循环部分,利用哈希表记录余数出现的位置,一旦发现余数重复即可插入括号标识循环节。

原题链接https://leetcode.com/problems/fraction-to-recurring-decimal/

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)".
模拟除法的过程,需要记录每次余数出现的位置。如果余数重复出现则有循环,然后再对应的位置插上括号。

每次都会碰到-2147483648,abs之后超出了int的最大值。。。

上次贴的代码有问题 。

class Solution {
public:
    string fractionToDecimal(int numerator, int denominator) {
		bool sign = true;
		long long num = numerator, den = denominator, integer;
		if (num * den < 0)sign = false;
		num = abs(num);
		den = abs(den);
		integer = num / den;
		string Decimal = "";
		unordered_map<int, int>vis;
		num = num % den;
		vis[num] = Decimal.length() + 1;
		while (num)
		{
			num *= 10;
			long long quotient = num / den;
			num = num % den;
			Decimal += (char)('0' + quotient);
			if (vis[num] != 0)
			{
				Decimal.insert(vis[num] - 1, 1, '(');
				Decimal.push_back(')');
				break;
			}
			vis[num] = Decimal.length() + 1;
		}
		stringstream ss("");
		ss << integer;
		if (Decimal != "")Decimal = "." + Decimal;
		if (sign)
			return ss.str() +  Decimal;
		else 
			return "-" + ss.str() + Decimal;
	}
};




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值