7
votes

Comment simplifier les fractions en C #?

Je recherche une bibliothèque ou un code existant pour simplifier les fractions.

Est-ce que quelqu'un a quelque chose à portée de main ou à des liens?

P.s. J'ai déjà Comprendre le processus mais ne veulent vraiment pas réécrire la roue

Mise à jour

OK J'ai vérifié le Bibliothèque de fractions sur le codeProject Mais le problème que j'ai est un peu plus rapide que de simplifier une fraction.

Je dois réduire un (fort> divisé en pourcentage qui pourrait être de 20% / 50% / 30% (toujours égal à 100%)


4 commentaires

Donc le pourcentage divisé pourrait être de 2 façons, 3 façons ou plus


Chaque pourcentage de la scission sera-t-il toujours un entier entre 0-100? Si oui j'ai une réponse pour vous.


oui ils seront entiers 0-100


Ouais presque fait, tenez-le - soyez comme 5-6 minutes;)


5 Réponses :


1
votes

Cette bibliothèque semble être ce dont vous avez besoin:

var f = new Fraction(numerator, denominator);
numerator = f.Numerator;
denominator = f.Denominator;


0 commentaires

1
votes

Le meilleur exemple de fraction (aka rationnelle) que j'ai vu est dans " Structures de données classiques de Timothy Budd "en C ++" . Sa mise en œuvre est très bonne. Il comprend une simple mise en œuvre de l'algorithme GCD.

Il ne devrait pas être difficile de s'adapter à C #.


0 commentaires

5
votes

Vous pouvez utiliser microsoft.fsharp.math.bigrational, qui se trouve dans le F # Power Pack bibliothèque. Bien que cela dépend de F # (qui est Gratis et inclus dans VS2010), il peut être utilisé à partir de C #.

BigRational reduced = BigRational.FromInt(4)/BigRational.FromInt(6);
Console.WriteLine(reduced);
    2/3
Console.WriteLine(reduced.Numerator);
    2
Console.WriteLine(reduced.Denominator);
    3


0 commentaires

2
votes

une solution personnalisée:

2
3
5


3 commentaires

Ajouter la vérification de la primalité était faux. Imaginez ce qui se passe lorsque vos données sont {2, 98} . En outre, plutôt que de tenter de diviser par tous les entiers <= 50, vous devez simplement utiliser votre liste de choix. Ensuite, vous pouvez créer un GCD et faire la boucle de division une seule fois.


De plus, étant donné que c'était votre premier programme C #, vous n'avez peut-être pas compris que vous pouvez utiliser cur% Divideby! = 0 Pour vérifier l'indivisibilité et que la matrice n'a qu'une dimension que vous pouvez utiliser Numéros.length pour obtenir le nombre d'éléments.


Ne fonctionne pas pour des cas comme {3, 3, 3} qui devrait réduire à {1, 1, 1}



16
votes

Je pense que vous avez juste besoin de diviser par le GCD de tous les chiffres.

void Simplify(int[] numbers)
{
    int gcd = GCD(numbers);
    for (int i = 0; i < numbers.Length; i++)
        numbers[i] /= gcd;
}
int GCD(int a, int b)
{
    while (b > 0)
    {
        int rem = a % b;
        a = b;
        b = rem;
    }
    return a;
}
int GCD(int[] args)
{
    // using LINQ:
    return args.Aggregate((gcd, arg) => GCD(gcd, arg));
}