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

จำนวนตรรกยะที่เท่ากันใน C++


สมมุติว่าเรามีสตริงสองอัน คือ S และ T ซึ่งแต่ละอันแทนจำนวนตรรกยะที่เป็นบวก เราต้องตรวจสอบว่ามันแทนตัวเลขเดียวกันหรือตอนนี้ สตริงอาจใช้วงเล็บเพื่อแสดงส่วนที่ซ้ำกันของจำนวนตรรกยะ

อย่างที่เราทราบดีว่าจำนวนตรรกยะสามารถแสดงได้มากถึงสามส่วน:ส่วนจำนวนเต็ม ส่วนที่ไม่ซ้ำ และส่วนที่ซ้ำ ตัวเลขจะแสดงด้วยวิธีใดวิธีหนึ่งจากสามวิธีต่อไปนี้ -

  • เฉพาะส่วนจำนวนเต็ม (เช่น 0, 12, 123)

  • IntegerPart.NonRepeatingPart (เช่น 0.5, 1.0, 2.12, 2.0001)

  • IntegerPart.NonRepeatingPart(RepeatingPart>) (เช่น 0.1(6), 0.9(9), 0.00(1212))

ตัวอย่างเช่น ทั้ง 0.1(6) หรือ 0.1666(6) หรือ 0.166(66) เป็นการแสดงที่ถูกต้องของ 1 / 6

ดังนั้น หากอินพุตเป็น S ="0.(52)" และ T ="0.5(25)" ผลลัพธ์จะเป็น True

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

  • กำหนดฟังก์ชัน f() ซึ่งจะใช้เวลา S

    • ผม :=ดัชนีของ '(' ใน S

    • ถ้าฉันอยู่ในช่วงความยาว S แล้ว −

      • base :=สตริงย่อยของ S จากดัชนี 0 ถึง i - 1

      • rep :=สตริงย่อยของ S จากดัชนี i + 1 ถึง (ความยาวของ S - i - 3)

      • สำหรับการเริ่มต้น j :=0 เมื่อ j <20 อัปเดต (เพิ่ม j ขึ้น 1) ให้ทำ -

        • ฐาน :=ฐาน + ตัวแทน

      • คืนค่าฐานเป็นมูลค่าจริง

    • คืนค่า S เป็นค่าจริง

  • จากหน้าที่หลักให้ทำดังต่อไปนี้ -

  • คืนค่าจริงเมื่อ f(S) เหมือนกับ f(T)

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

ตัวอย่าง

#include <bits/stdc++.h>
using namespace std;class Solution {
   public:
   bool isRationalEqual(string S, string T){
      return f(S) == f(T);
   }
   double f(string S){
      auto i = S.find("(");
      if (i != string::npos) {
         string base = S.substr(0, i);
         string rep = S.substr(i + 1, S.length() - i - 2);
         for (int j = 0; j < 20; ++j)
         base += rep;
         return stod(base);
      }
      return stod(S);
   }
};
main(){
   Solution ob;
   cout << (ob.isRationalEqual("0.(52)", "0.5(25)"));
}

อินพุต

"0.(52)", "0.5(25)"

ผลลัพธ์

1