สมมติว่าเรามีจำนวนเต็มสองตัวแทนตัวเศษและตัวส่วนของเศษส่วน เราต้องหาเศษส่วนในรูปแบบสตริง ถ้าส่วนที่ซ้ำกัน ให้ใส่ส่วนที่ซ้ำไว้ในวงเล็บ ดังนั้นหากตัวเศษเป็น 2 และตัวส่วนเป็น 3 ผลลัพธ์จะเป็น “0.(6)”
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
ถ้าตัวเศษเป็น 0 ให้คืนค่า 0
-
กำหนดหนึ่งอาร์เรย์และ
-
ถ้าตัวเศษ <0 และตัวส่วน> 0 หรือตัวเศษ 0 และตัวส่วน <0 ให้ใส่สัญลักษณ์ลบ '-' ลงในอาร์เรย์ ans
-
ตัวหาร :=| ตัวเศษ | และเงินปันผล :=| ตัวส่วน| ส่วนที่เหลือ :=ตัวหาร ตัวหาร ตัวหาร ตัวหาร
-
x :=สตริงของตัวหาร / เงินปันผล
-
แทรกอักขระแต่ละตัวจาก x ลงในอาร์เรย์ ans
-
ถ้าเศษ =0 ให้ส่งคืน ans array เป็นสตริง
-
แทรกจุด '.' ลงใน ans
-
กำหนดหนึ่งแผนที่ m
-
ในขณะที่ส่วนที่เหลือไม่ใช่ 0
-
หากเหลืออยู่ในหน่วย m แล้ว
-
ใส่วงเล็บเปิดที่ดัชนี m[remainder] ของ ans
-
ใส่วงเล็บปิดลงใน ans ตอนท้าย
-
หมดห่วง
-
-
อย่างอื่น
-
m[remainder] :=ขนาดของ ans
-
ส่วนที่เหลือ :=ส่วนที่เหลือ * 10
-
แทรก (ส่วนที่เหลือ / เงินปันผล) เป็นอักขระลงใน ans
-
ส่วนที่เหลือ :=เงินปันผล mod ที่เหลือ
-
-
-
ส่งคืนอาร์เรย์เป็นสตริง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; class Solution { public: string fractionToDecimal(int numerator, int denominator) { if(numerator == 0)return "0"; vector <char> ans; if(numerator < 0 && denominator > 0 || numerator > 0 && denominator < 0)ans.push_back('-'); long divisor = labs(numerator); long dividend = labs(denominator); long remainder = divisor % dividend; string x = to_string(divisor/dividend); for(int i = 0; i < x.size(); i++){ ans.push_back(x[i]); } if(remainder == 0){ return string(ans.begin(), ans.end()); } ans.push_back('.'); map <int, int> m; while(remainder != 0){ if(m.find(remainder)!=m.end()){ ans.insert(ans.begin() + m[remainder], '('); ans.push_back(')'); break; }else{ m[remainder] = ans.size(); remainder *= 10; ans.push_back((remainder / dividend) + '0'); remainder %= dividend; } } return string(ans.begin(), ans.end()); } }; main(){ Solution ob; cout << ((ob.fractionToDecimal(100,6))); }
อินพุต
100 6
ผลลัพธ์
16.(6)