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

โปรแกรมแสดงเลขทศนิยมจากการแสดงจำนวนตรรกยะในภาษา C++


สมมติว่าเรามีตัวเลขสองตัวที่เรียกว่าตัวเศษและตัวส่วนแทนจำนวนตรรกยะในรูปแบบ (ตัวเศษ / ตัวส่วน) เราต้องหาการแสดงทศนิยมเป็นสตริง หากมีตัวเลขซ้ำๆ ให้ใส่วงเล็บเหลี่ยม

ดังนั้น หากอินพุตเหมือนกับตัวเศษ =164 ตัวส่วน =3 ผลลัพธ์จะเป็น "54.(6)"

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • ถ้าตัวเศษเหมือนกับ 0 แล้ว −
    • คืนค่า "0"
  • กำหนดอาร์เรย์และ
  • ถ้าตัวเศษ <0 และตัวส่วน> 0 หรือตัวเศษ> 0 และตัวส่วน <0 แล้ว −
    • ใส่ '-' ต่อท้ายคำตอบ
  • ตัวหาร :=| ตัวเศษ|
  • เงินปันผล :=|ตัวส่วน|
  • ที่เหลือ :=ตัวหาร ตัวหาร ตัวหาร เงินปันผล
  • x :=แปลง (ตัวหาร / เงินปันผล) เป็นสตริง
  • สำหรับการเริ่มต้น i :=0 เมื่อ i <ขนาด x อัปเดต (เพิ่ม i ขึ้น 1) ทำ −
    • ใส่ x[i] ต่อท้าย ans
  • ถ้าเศษเหลือเท่ากับ 0 แล้ว −
    • คืนค่า ans เป็นสตริง
  • แทรก '.' ต่อท้าย ans
  • กำหนดหนึ่งแผนที่ m
  • ในขณะที่เศษเหลือไม่เท่ากับ 0, ทำ −
    • ถ้าเศษที่เหลือไม่เป็น m แล้ว −
      • แทรก (องค์ประกอบแรกของ ans เชื่อม '(') ลงใน ans
      • ใส่ ')' ต่อท้ายคำตอบ
      • ออกมาจากวงจร
    • มิฉะนั้น −
      • m[remainder] :=ขนาดของ ans
      • เศษ :=เศษเหลือ * 10
      • แทรก (ส่วนที่เหลือ / เงินปันผล) ต่อ '0' ต่อท้ายคำตอบ
      • remainder :=เศษ mod ที่เหลือ
  • คืนค่า ans เป็นสตริง

ตัวอย่าง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   string solve(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());
   }
};
string solve(int numerator, int denominator) {
   return (new Solution())->solve(numerator, denominator);
}
int main() {
   cout << solve(164, 3);
}

อินพุต

164, 3

ผลลัพธ์

54.(6)