กลับไปยังโจทย์
ปานกลาง 0 ข้อที่แก้แล้ว อัตราผ่าน 0%

การคำนวณเศษส่วนอย่างแม่นยำ

ดำเนินการกับเศษส่วนและคืนค่าเศษส่วนที่ย่อส่วนแล้ว

สิ่งที่คุณจะได้เรียนรู้

  • บวก ลบ คูณ และหารเศษส่วน
  • ทอนผลลัพธ์ด้วย ห.ร.ม.
  • ปรับเครื่องหมายและศูนย์ให้เป็นมาตรฐาน

โจทย์

แทนค่าเศษส่วนด้วย [ตัวเศษ, ตัวส่วน] ดำเนินการกับตัวแรกและตัวที่สอง: บวก, ลบ, คูณ หรือ หาร สำหรับค่าสัมบูรณ์ ใช้เฉพาะตัวแรก สำหรับยกกำลัง ให้นำตัวแรกยกกำลังเลขจำนวนเต็มและไม่สนใจตัวที่สอง คืนค่าในรูปเศษส่วนต่ำสุดโดยตัวส่วนเป็นบวก กรณีศูนย์ให้ปรับเป็น [0, 1] ทุกการหารและการยกกำลังติดลบในอินพุตที่ถูกต้องจะนิยามค่าไว้แล้ว

ให้เขียนฟังก์ชัน rational_arithmetic(operation, first, second, exponent)

อินพุต

operation: ชื่อของการดำเนินการ

first: จำนวนเต็มสองจำนวนแทนเศษส่วนตัวแรก

second: จำนวนเต็มสองจำนวนแทนเศษส่วนตัวที่สอง; ใช้ [0, 1] เมื่อไม่ใช้งาน

exponent: เลขชี้กำลังสำหรับการยกกำลัง; ใช้ 0 สำหรับการดำเนินการอื่น

เอาต์พุต

คืนค่า [ตัวเศษ, ตัวส่วน] ในรูปที่ย่อส่วนแล้วและตัวส่วนเป็นบวก

เงื่อนไข

operation ต้องเป็น add, subtract, multiply, divide, absolute หรือ power องค์ประกอบของเศษส่วนแต่ละตัวมีค่าสูงสุดไม่เกิน 100; ตัวส่วนไม่เป็นศูนย์ −6 ≤ exponent ≤ 6 สำหรับ divide ตัวที่สองต้องมีตัวเศษไม่เป็นศูนย์ สำหรับการยกกำลังติดลบ ตัวแรกต้องมีตัวเศษไม่เป็นศูนย์ กำลังศูนย์ให้เป็น [1, 1] รวมถึง 0⁰ ตามข้อกำหนดข้อนี้ ค่าทั้งหมดอยู่ในช่วง signed 64-bit

ตัวอย่าง

ตัวอย่างที่ 1
อินพุต:
first = [1, 6]
second = [1, 4]
exponent = 0
operation = "add"

ผลลัพธ์ที่คาดหวัง:
expected = [5, 12]
อินพุต:
std::vector<long long> first = {1, 6};
std::vector<long long> second = {1, 4};
long long exponent = 0;
std::string operation = "add";

ผลลัพธ์ที่คาดหวัง:
std::vector<long long> expected = {5, 12};
อินพุต:
long[] first = new long[] {1, 6};
long[] second = new long[] {1, 4};
long exponent = 0;
string operation = "add";

ผลลัพธ์ที่คาดหวัง:
long[] expected = new long[] {5, 12};

คำอธิบาย

1/6 + 1/4 = 2/12 + 3/12 = 5/12 ซึ่งอยู่ในรูปที่ย่อส่วนแล้ว

ตัวอย่างที่ 2
อินพุต:
first = [2, 3]
second = [0, 1]
exponent = -2
operation = "power"

ผลลัพธ์ที่คาดหวัง:
expected = [9, 4]
อินพุต:
std::vector<long long> first = {2, 3};
std::vector<long long> second = {0, 1};
long long exponent = -2;
std::string operation = "power";

ผลลัพธ์ที่คาดหวัง:
std::vector<long long> expected = {9, 4};
อินพุต:
long[] first = new long[] {2, 3};
long[] second = new long[] {0, 1};
long exponent = -2;
string operation = "power";

ผลลัพธ์ที่คาดหวัง:
long[] expected = new long[] {9, 4};

คำอธิบาย

เลขชี้กำลังติดลบจะสลับเศษกับส่วน: (2/3)⁻² = (3/2)² = 9/4

แนวทางการแก้

ลองทำเองก่อน แล้วค่อยเปิดคำใบ้ทีละข้อ

คำใบ้ 1

แปลงเศษส่วนแต่ละตัวให้อยู่ในรูปเดียวกัน แล้วรวมตัวเศษตามการดำเนินการที่เลือก

คำใบ้ 2

หลังคำนวณแล้ว ย่อผลลัพธ์โดยหารด้วย gcd และทำให้ตัวส่วนเป็นบวก

คำใบ้ 3

ระวังกรณีพิเศษอย่างผลลัพธ์เป็นศูนย์, ค่าสัมบูรณ์, และกฎยกกำลังที่มีเลขชี้กำลัง 0 หรือค่าติดลบ

ความซับซ้อนที่คาดหวัง

เวลา O(log n), หน่วยความจำเพิ่ม O(1)

แหล่งอ้างอิง

โจทย์นี้ปรับให้เหมาะกับ CodeUtility กรุณาทำตามคำชี้แจงและข้อจำกัดด้านบน

เรียนรู้จากคนอื่น

แนวทางจากชุมชน

ยังไม่มีวิธีทำที่เผยแพร่ ลองแก้โจทย์นี้เพื่อแชร์วิธีแรก