Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

เศษส่วนเป็นทศนิยมที่เกิดซ้ำใน C++


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