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;
}
È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top