166分數到小數(HashMap)

1、題目描述

給定兩個整數,分別表示分數的分子 numerator 和分母 denominator,以字符串形式返回小數。

如果小數部分爲循環小數,則將循環的部分括在括號內。

2、示例

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

3、題解

基本思想:HashMap,HashMap爲餘數和當前餘數對應商所在res位置的映射,當在HashMap中找到出現過的餘數時,說明有小數開始循環,通過餘數找到對應開始循環的位置加入左括號(。

#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<unordered_map>
using namespace std;
class Solution {
public:
	string fractionToDecimal(int numerator, int denominator) {
		//基本思想:HashMap,HashMap爲餘數和當前餘數對應商所在res位置的映射
		//當在HashMap中找到出現過的餘數時,說明有小數開始循環,通過餘數找到對應開始循環的位置加入左括號(
		if (numerator == 0)
			return "0";
		string res;
		unordered_map<int, int> HashMap;
		//q爲兩數相除的商,r爲兩數相除的餘數
		long long q, r, x, y;  //防止-INT_MIN/1的情況,因爲INT_MIN的範圍大於INT_MAX
		int pos;
		//算術顯示強制轉換效率更高
		x = static_cast<long long>(numerator);
		y = static_cast<long long>(denominator);
		if ((x > 0) ^ (y > 0))    //x和y不同號加入負號
			res += "-";
		x = llabs(x);
		y = llabs(y);
		q = x / y;
		r = x % y;
		res += to_string(q);
		if (r == 0)
			return res;
		res += ".";
		while (HashMap.find(r) != HashMap.end())
		{
			HashMap[r] = res.size();
			q = r;
			q *= 10;
			r = q % y;
			q = q / y;
			res += to_string(q);
			if (r == 0)
				return res;
		}
		res.insert(HashMap[r], "(");
		res += ')';
		return res;
	}
};
int main()
{
	Solution solute;
	int numerator = -2147483648, denominator = 1;
	cout << solute.fractionToDecimal(numerator, denominator) << endl;
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章