Problème
Représentez une fraction sous la forme [numérateur, dénominateur]. Appliquez l’opération à la première et à la seconde : addition, soustraction, multiplication ou division. Pour la valeur absolue, utilisez uniquement la première. Pour la puissance, élevez la première à l’exposant entier et ignorez la seconde. Retournez le résultat sous forme irréductible avec un dénominateur positif. Normalisez zéro en [0, 1]. Toutes les divisions et puissances négatives dans les entrées valides sont définies.
Implémentez rational_arithmetic(operation, first, second, exponent).
Entrée
operation : Le nom de l’opération.
first : Deux entiers représentant la première fraction.
second : Deux entiers représentant la seconde fraction ; utilisez [0, 1] lorsqu’elle n’est pas utilisée.
exponent : L’exposant pour la puissance ; utilisez 0 pour les autres opérations.
Sortie
Retournez [numérateur, dénominateur] sous forme réduite avec un dénominateur positif.
Contraintes
operation vaut add, subtract, multiply, divide, absolute ou power. Les deux composantes des fractions ont une valeur absolue maximale de 100 ; les dénominateurs sont non nuls. −6 ≤ exponent ≤ 6. Pour divide, le numérateur de second est non nul. Pour une puissance négative, le numérateur de first est non nul. La puissance 0 donne [1, 1], y compris pour 0⁰ selon la convention de cet exercice. Les valeurs tiennent dans un entier signé 64 bits.
Exemples
Entrée :
first = [1, 6]
second = [1, 4]
exponent = 0
operation = "add"
Sortie attendue :
expected = [5, 12]
Entrée :
std::vector<long long> first = {1, 6};
std::vector<long long> second = {1, 4};
long long exponent = 0;
std::string operation = "add";
Sortie attendue :
std::vector<long long> expected = {5, 12};
Entrée :
long[] first = new long[] {1, 6};
long[] second = new long[] {1, 4};
long exponent = 0;
string operation = "add";
Sortie attendue :
long[] expected = new long[] {5, 12};
Explication
1/6 + 1/4 = 2/12 + 3/12 = 5/12, déjà irréductible.
Entrée :
first = [2, 3]
second = [0, 1]
exponent = -2
operation = "power"
Sortie attendue :
expected = [9, 4]
Entrée :
std::vector<long long> first = {2, 3};
std::vector<long long> second = {0, 1};
long long exponent = -2;
std::string operation = "power";
Sortie attendue :
std::vector<long long> expected = {9, 4};
Entrée :
long[] first = new long[] {2, 3};
long[] second = new long[] {0, 1};
long exponent = -2;
string operation = "power";
Sortie attendue :
long[] expected = new long[] {9, 4};
Explication
Un exposant négatif inverse la fraction : (2/3)⁻² = (3/2)² = 9/4.
Comment l'aborder
Essayez d'abord seul, puis ouvrez les indices un par un.
Indice 1
Convertis chaque fraction dans une forme commune et combine les numérateurs selon l’opération choisie.
Indice 2
Après l’opération, réduis le résultat en divisant par le plus grand commun diviseur et rends le dénominateur positif.
Indice 3
Fais attention aux cas spéciaux comme les résultats nuls, la valeur absolue, et la règle de puissance avec exposants nuls ou négatifs.
Complexité attendue
temps O(log n), espace supplémentaire O(1)
Références
Ce défi a été adapté pour CodeUtility. Suivez l'énoncé et les contraintes ci-dessus.