C++實(shí)現(xiàn)LeetCode(166.分?jǐn)?shù)轉(zhuǎn)循環(huán)小數(shù))
[LeetCode] 166.Fraction to Recurring Decimal 分?jǐn)?shù)轉(zhuǎn)循環(huán)小數(shù)
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)".
Credits:
Special thanks to @Shangrila for adding this problem and creating all test cases.
這道題還是比較有意思的,開(kāi)始還擔(dān)心萬(wàn)一結(jié)果是無(wú)限不循環(huán)小數(shù)怎么辦,百度之后才發(fā)現(xiàn)原來(lái)可以寫(xiě)成分?jǐn)?shù)的都是有理數(shù),而有理數(shù)要么是有限的,要么是無(wú)限循環(huán)小數(shù),無(wú)限不循環(huán)的叫無(wú)理數(shù),例如圓周率pi或自然數(shù)e等,小學(xué)數(shù)學(xué)沒(méi)學(xué)好,汗!由于還存在正負(fù)情況,處理方式是按正數(shù)處理,符號(hào)最后在判斷,那么我們需要把除數(shù)和被除數(shù)取絕對(duì)值,那么問(wèn)題就來(lái)了:由于整型數(shù)INT的取值范圍是-2147483648~2147483647,而對(duì)-2147483648取絕對(duì)值就會(huì)超出范圍,所以我們需要先轉(zhuǎn)為long long型再取絕對(duì)值。那么怎么樣找循環(huán)呢,肯定是再得到一個(gè)數(shù)字后要看看之前有沒(méi)有出現(xiàn)這個(gè)數(shù)。為了節(jié)省搜索時(shí)間,我們采用哈希表來(lái)存數(shù)每個(gè)小數(shù)位上的數(shù)字。還有一個(gè)小技巧,由于我們要算出小數(shù)每一位,采取的方法是每次把余數(shù)乘10,再除以除數(shù),得到的商即為小數(shù)的下一位數(shù)字。等到新算出來(lái)的數(shù)字在之前出現(xiàn)過(guò),則在循環(huán)開(kāi)始出加左括號(hào),結(jié)束處加右括號(hào)。代碼如下:
class Solution {
public:
string fractionToDecimal(int numerator, int denominator) {
int s1 = numerator >= 0 ? 1 : -1;
int s2 = denominator >= 0 ? 1 : -1;
long long num = abs( (long long)numerator );
long long den = abs( (long long)denominator );
long long out = num / den;
long long rem = num % den;
unordered_map<long long, int> m;
string res = to_string(out);
if (s1 * s2 == -1 && (out > 0 || rem > 0)) res = "-" + res;
if (rem == 0) return res;
res += ".";
string s = "";
int pos = 0;
while (rem != 0) {
if (m.find(rem) != m.end()) {
s.insert(m[rem], "(");
s += ")";
return res + s;
}
m[rem] = pos;
s += to_string((rem * 10) / den);
rem = (rem * 10) % den;
++pos;
}
return res + s;
}
};
- C++實(shí)現(xiàn)LeetCode(173.二叉搜索樹(shù)迭代器)
- C++實(shí)現(xiàn)LeetCode(172.求階乘末尾零的個(gè)數(shù))
- C++實(shí)現(xiàn)LeetCode(170.兩數(shù)之和之三 - 數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì))
- C++實(shí)現(xiàn)LeetCode(169.求大多數(shù))
- C++實(shí)現(xiàn)LeetCode(171.求Excel表列序號(hào))
- C++實(shí)現(xiàn)LeetCode(168.求Excel表列名稱)
- C++實(shí)現(xiàn)LeetCode(167.兩數(shù)之和之二 - 輸入數(shù)組有序)
- C++實(shí)現(xiàn)LeetCode(179.最大組合數(shù))
相關(guān)文章
C++入門之實(shí)現(xiàn)十步萬(wàn)度游戲
這篇文章主要介紹了C++入門實(shí)現(xiàn)十步萬(wàn)度游戲,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-10-10
C++ 組合 (Composition)的介紹與實(shí)例
這篇文章主要給大家介紹了關(guān)于C++ 組合(Composition)的相關(guān)資料,組合就是將對(duì)象組合成樹(shù)形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu),使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。需要的朋友可以參考下2021-05-05
C++中的不規(guī)則二維數(shù)組實(shí)現(xiàn)代碼
本文介紹了一個(gè)在C++中保存不定長(zhǎng)二維數(shù)組的數(shù)據(jù)結(jié)構(gòu),在這個(gè)結(jié)構(gòu)中,我們使用了一個(gè)含有指針和數(shù)組長(zhǎng)度的結(jié)構(gòu)體,用這樣的一個(gè)結(jié)構(gòu)體構(gòu)造一個(gè)結(jié)構(gòu)體數(shù)組,用于存儲(chǔ)每一個(gè)不定長(zhǎng)的數(shù)組,感興趣的朋友一起看看吧2024-03-03
kernel劫持modprobe?path內(nèi)容詳解
這篇文章主要為大家介紹了kernel劫持modprobe?path的內(nèi)容詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
用C語(yǔ)言實(shí)現(xiàn)鏈?zhǔn)綏=榻B
大家好,本篇文章主要講的是用C語(yǔ)言實(shí)現(xiàn)鏈?zhǔn)綏=榻B,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12

