Mittel 0 gelöst 0% Erfolgsquote

Exakte Bruchrechnung

Führe Bruchoperationen durch und gib einen gekürzten Bruch zurück.

Das lernst du

  • Brüche addieren, subtrahieren, multiplizieren und dividieren
  • Ergebnisse mit dem ggT kürzen
  • Vorzeichen und Null normalisieren

Problem

Stelle einen Bruch als [Zähler, Nenner] dar. Wende die Operation auf den ersten und zweiten Bruch an: addieren, subtrahieren, multiplizieren oder dividieren. Für den Betrag verwende nur den ersten Bruch. Für Potenzen hebe den ersten Bruch auf den ganzzahligen Exponenten und ignoriere den zweiten. Gib das Ergebnis in vollständig gekürzter Form mit positivem Nenner zurück. Normiere Null zu [0, 1]. Alle Divisionen und negativen Potenzen in gültigen Eingaben sind definiert.

Implementiere rational_arithmetic(operation, first, second, exponent).

Eingabe

operation: Der Name der Operation.

first: Zwei ganze Zahlen, die den ersten Bruch darstellen.

second: Zwei ganze Zahlen, die den zweiten Bruch darstellen; verwende [0, 1], wenn nicht benötigt.

exponent: Der Exponent für Potenzen; bei anderen Operationen 0 verwenden.

Ausgabe

Gib [Zähler, Nenner] in gekürzter Form mit positivem Nenner zurück.

Einschränkungen

operation ist add, subtract, multiply, divide, absolute oder power. Beide Bruchkomponenten haben einen Betrag von höchstens 100; Nenner sind ungleich null. −6 ≤ exponent ≤ 6. Bei divide hat der zweite Bruch einen Zähler ungleich null. Bei einer negativen Potenz hat der erste Bruch einen Zähler ungleich null. Die 0. Potenz ist [1, 1], einschließlich 0⁰ gemäß dieser Aufgabenstellung. Alle Werte passen in ein vorzeichenbehaftetes 64-Bit-Integer.

Beispiele

Beispiel 1
Eingabe:
first = [1, 6]
second = [1, 4]
exponent = 0
operation = "add"

Erwartete Ausgabe:
expected = [5, 12]
Eingabe:
std::vector<long long> first = {1, 6};
std::vector<long long> second = {1, 4};
long long exponent = 0;
std::string operation = "add";

Erwartete Ausgabe:
std::vector<long long> expected = {5, 12};
Eingabe:
long[] first = new long[] {1, 6};
long[] second = new long[] {1, 4};
long exponent = 0;
string operation = "add";

Erwartete Ausgabe:
long[] expected = new long[] {5, 12};

Erläuterung

1/6 + 1/4 = 2/12 + 3/12 = 5/12, bereits gekürzt.

Beispiel 2
Eingabe:
first = [2, 3]
second = [0, 1]
exponent = -2
operation = "power"

Erwartete Ausgabe:
expected = [9, 4]
Eingabe:
std::vector<long long> first = {2, 3};
std::vector<long long> second = {0, 1};
long long exponent = -2;
std::string operation = "power";

Erwartete Ausgabe:
std::vector<long long> expected = {9, 4};
Eingabe:
long[] first = new long[] {2, 3};
long[] second = new long[] {0, 1};
long exponent = -2;
string operation = "power";

Erwartete Ausgabe:
long[] expected = new long[] {9, 4};

Erläuterung

Ein negativer Exponent kehrt den Bruch um: (2/3)⁻² = (3/2)² = 9/4.

So gehst du vor

Versuch es zuerst allein und öffne dann einen Hinweis nach dem anderen.

Hinweis 1

Bringe jeden Bruch auf eine gemeinsame Darstellung und kombiniere die Zähler gemäß der gewählten Operation.

Hinweis 2

Kürze das Ergebnis danach durch Division mit dem größten gemeinsamen Teiler und mache den Nenner positiv.

Hinweis 3

Achte auf Sonderfälle wie 0-Ergebnisse, den Betrag und bei der Potenzregel auf 0 sowie negative Exponenten.

Erwartete Komplexität

Zeit O(log n), zusätzlicher Speicher O(1)

Referenzen

Diese Aufgabe wurde für CodeUtility angepasst. Beachte die oben genannten Vorgaben und Einschränkungen.

Von anderen lernen

Community-Lösungen

Noch keine veröffentlichten Lösungen. Löse die Aufgabe und teile als Erster eine Lösung.