Retour aux défis
Moyen 0 résolus 0 % de réussite

Arithmétique exacte des fractions

Effectuez des opérations sur des fractions et retournez une fraction réduite.

Ce que vous allez apprendre

  • Additionner, soustraire, multiplier et diviser des fractions
  • Simplifier les résultats avec le PGCD
  • Normaliser le signe et le zéro

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

Exemple 1
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.

Exemple 2
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.

Apprenez des autres

Solutions de la communauté

Aucune solution publiée pour l'instant. Résolvez ce défi pour partager la première.