C++程式:將兩個數字的分數表示為字串格式
給定兩個整數分子和一個分母。我們需要將這兩個整數的分數表示為字串格式。如果某個小數是迴圈的,我們需要用括號來表示其迴圈序列。
演算法(步驟)
以下是執行所需任務的演算法/步驟:
在確定小數部分之前,先確定整數商(小數點前的絕對部分)。
將餘數(分子 % 分母)放入對映中,鍵為餘數,值為該餘數出現的索引位置,以檢視小數部分是否重複。
如果在任何時刻餘數為零,則不存在重複小數。
如果餘數已在對映中出現,則存在重複小數。
示例
假設一個整數為分子'8',另一個整數為分母'6'。
int numerator = 8, denominator = 6; res = solve(numerator, denominator);
所以分數是 8/6,也就是 1.333... 所以我們需要輸出 "1.(3)"。括號表示重複的小數部分,如果沒有重複部分,則直接輸出字串值。
我們首先可以計算整數部分並將其儲存在字串中。之後,我們可以使用餘數找到小數部分,直到它變為 0 或直到我們找到一個重複序列。為了找到重複序列,我們可以將餘數儲存在對映中,如果我們在對映中碰巧看到相同的餘數,我們可以確定該序列是重複的。對映中的值部分將是該小數第一次出現的索引,以便我們可以在該索引處放置括號。
#include <iostream> #include <map> using namespace std; string solve(int numerator, int denominator) { if (numerator == 0) { return "0"; } if(denominator == 0) { return "INFINITY"; } string ans = ""; if ( ((numerator < 0) ^ (denominator < 0)) ) { ans+="-"; } numerator = abs(numerator); denominator = abs(denominator); ans+=to_string(numerator/denominator); if(numerator%denominator == 0) return ans; ans+="."; int remainder = numerator % denominator; map<int, int> mp; while (remainder > 0) { if (mp.find(remainder) != mp.end()) { ans += ")"; ans.insert(mp[remainder], "("); break; } else { mp[remainder] = ans.size(); } remainder*=10; ans+= to_string(remainder/denominator); remainder = remainder % denominator; } return ans; } int main() { int numerator = 8, denominator = 6; cout << solve(numerator, denominator) << endl; return 0; }
輸出
1.(3)
結論
我們可以看到,使用對映作為雜湊來查詢重複的餘數,並存儲我們可以再次開始序列的索引作為鍵值對中的值,這使得跟蹤和查詢答案變得容易得多。這個問題需要使用正確的資料結構和一些觀察。
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP