สมมุติว่าเรามีสตริงสองอัน คือ 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