Calcolare un rapporto in C #
-
22-08-2019 - |
Domanda
Ho pensato che questo sarebbe stato semplice, ma la ricerca Google non è sembrato aiutare.
praticamente sto cercando di scrivere una funzione che restituirà un rapporto come una stringa (ad esempio, 4: 3), quando forniture con due numeri interi (ad esempio, 800 e 600)
.string GetRatio(Int A, Int B) {
// Code I'm looking for
return Ratio;
}
Soluzione
È possibile semplificare frazioni dividendo numeratore e denominatore per il loro GCD :
var gcd = GCD(A, B);
return string.Format("{0}:{1}", A / gcd, B / gcd)
E una funzione molto di base per il calcolo del MCD, utilizzando il euclidea algoritmo :
static int GCD(int a, int b) {
return b == 0 ? Math.Abs(a) : GCD(b, a % b);
}
Altri suggerimenti
Si sta sostanzialmente cercando di ottenere il massimo comune denominatore -? GCD per i due numeri e poi dividendoli per questo e quindi ottenere la stringa
cioè: 800: 600; il massimo comune denominatore = 200 così 4: 3.
Questo sarebbe in grado di affrontare tutti i numeri interi. Mi spiace di non inviare il codice, ma penso che da questo su di esso dovrebbe essere abbastanza semplice.
public int GCD(int a, int b)
{
while (a != 0 && b != 0)
{
if (a > b)
a %= b;
else
b %= a;
}
if (a == 0)
return b;
else
return a;
}
// Using Konrad's code:
var gcd = GCD(A, B);
return string.Format("{0}:{1}", A / gcd, B / gcd)
Dopo aver giocato con queste cose in passato, mi limiterò a aggiungere che si tratta di valori con segno può ottenere brutto. Mi permetto di suggerire che il modo più semplice per gestire i valori con segno è quello di applicare l'approccio di Konrad per valori assoluti dei vostri numeri originali, quindi anteporre un '-' per la stringa risultante se i valori originali hanno segni diversi.
Con questo approccio, il massimo comune divisore di -100 e -35 è 5, per un rapporto di 20: 7. Se gli ingressi originali erano stati una delle coppie (-100 e 35) o (100 e -35), si sarebbe ancora ottenere un GCD 5, e un risultato iniziale di 20: 7, ma la risposta finale sarebbe - 20: 7 (cioè forma standardizzata indipendentemente da quale ingresso è negativo, come sia -6/2 e 6 / -2 = -3)
.Altri commentatori hanno dato buone soluzioni per gli interi; se si hanno veramente a che fare con i valori in virgola mobile, però, avrete bisogno di qualcosa di diverso. In generale, due numeri reali non avranno un rapporto pulito che può essere stampata prettily; ciò che si vuole è l'approssimazione razionale più vicino. Probabilmente il modo migliore per andare su come trovare che è solo per calcolare l'espansione frazione continua del quoziente; Mark Dominus dà una buona introduzione a quelle sul suo blog .