สมมติว่าเรามีจำนวนเต็มสองตัวแทนตัวเศษและตัวส่วนของเศษส่วน เราต้องหาเศษส่วนในรูปแบบสตริง ถ้าส่วนที่ซ้ำกัน ให้ใส่ส่วนที่ซ้ำไว้ในวงเล็บ ดังนั้นหากตัวเศษเป็น 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)