2012-05-15 36 views
5

In realtà è piuttosto difficile da descrivere:
Voglio implementare un algoritmo che confronta figura per figura della stessa posizione (come faccio i miei calcoli in un sistema basato su 10 è piuttosto la stessa "potenza di dieci") di due dato numeri interi/numero (con la stessa "lunghezza"). Esso dovrebbe restituire il grado di uguaglianza come segue:Come si calcola la somiglianza di due numeri interi?

  • 4491 e 1020 = 0
  • 4491 e 4123 = 1
  • 4491 e 4400 = 2
  • 4491 e 4493 = 3
  • 4491 e 4491 = 4
  • 4491 e 4091 = 1

non voglio fare i miei calcoli sulla base di una stringa-comp arison, come lo farò in uno scenario più grande :)

+2

appena notato questo è ambiguo ... fa 4491 e 4091 dare 1 o 3? – Rawling

+0

@Rawling ha appena aggiornato la mia domanda! –

+0

Eccellente, ipotesi fortunata da parte mia :) – Rawling

risposta

3
public static int Compare(int i1, int i2) 
{ 
    int result = 0; 
    while(i1 != 0 && i2 != 0) 
    { 
     var d1 = i1 % 10; 
     var d2 = i2 % 10; 
     i1 /= 10; 
     i2 /= 10; 
     if(d1 == d2) 
     { 
      ++result; 
     } 
     else 
     { 
      result = 0; 
     } 
    } 
    if(i1 != 0 || i2 != 0) 
    { 
     throw new ArgumentException("Integers must be of same length."); 
    } 
    return result; 
} 

Nota: non gestisce interi negativi

Aggiornamento: fisso dopo l'aggiornamento domanda

+0

Mi piace questo (dopo che la mia soluzione è andata a fuoco ...) Che cosa fa se i numeri sono di lunghezza diversa? – Rawling

+2

Beh, non è gestito (anche se è molto facile da aggiungere).OP non ha definito alcun comportamento per questo caso, quindi mi limiterò a lanciare un'eccezione. – max

+0

Bene, hai il mio +1. Spero che anche alcuni degli altri prenderanno nota. – Rawling

0

Sembra che il Levenshtein Distance sia appropriato. Questo è un modo standard per misurare la differenza tra due stringhe. Nel tuo caso, le stringhe sono le rappresentazioni decimali dei numeri.

+0

Penso che levenshtein non si applichi a questo problema – Jorge

1

See the Answer to this SO Question

È possibile dividere le cifre per il primo metodo e ottenere il somiglianza dalla Seconda metodo:

int[] GetIntArray(int num) 
{ 
    List<int> listOfInts = new List<int>(); 
    while(num > 0) 
    { 
     listOfInts.Add(num % 10); 
     num /= 10; 
    } 
    listOfInts.Reverse(); 
    return listOfInts.ToArray(); 
} 

int GetSimilarity(int firstNo, int secondNo) 
{ 
    int[] firstintarray = GetIntArray(firstNo) 
    int[] secondintarray = GetIntArray(secondNo) 
    if (firstintarray.Count != secondintarray.Count) 
    { 
     throw new ArgumentException("Numbers Unequal in Length!"); 
    } 
    int similarity = 0; 
    for(i = 0; i < firstintarray.Count; i++) 
    { 
     if (secondintarray[i] = firstintarray[i]) 
     { 
      similarity++; 
      continue; 
     } 
     break; 
    } 
} 

Ora è ca n Confrontare i due array int simili:

int Similarity = GetSimilarity(4491, 4461);// Returns 2 
+0

interessante ... ma troppa gestione della matrice che si trova sul lato inferiore delle prestazioni ... –

1

Per tutti i casi in cui X e Y non sono uguali:

Length - Math.Floor(Math.Log10(Math.Abs(X - Y)) + 1) 

4491 e 1020

4 - Math.Floor(Math.Log10(Math.Abs(4491 - 1020)) + 1) = 0 

4491 e 4493

4 - Math.Floor(Math.Log10(Math.Abs(4491 - 4493)) + 1) = 3 
+0

principalmente uguale a http://stackoverflow.com/a/10601394/57508, ma con la correzione di 'log (1, 10) ':) –

+0

Ancora non riesce con' 4489' e '4491', però. – Rawling

1

Giusto per cercare di salvaguardare e qualcosa da questa domanda dopo il mio ultimo tentativo ...

int Compare(int x, int y) 
{ 
    int pow10 = (int)Math.Pow(10, Math.Floor(Math.Log(Math.Max(x, y), 10))); 
    int matches = 0; 
    while(pow10 > 0 && (x/pow10) == (y/pow10)) 
    { 
     matches++; 
     pow10 /= 10; 
    } 
    return matches; 
} 
-1

io cosa il modo migliore per calcolarlo sta usando euclidea somiglianza.

Si prega di consultare questo link: http://stackoverflow.com/questions/11555355/calculating-the-distance-between-2-points

+1

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. - [Dalla recensione] (/ recensione/post di bassa qualità/18304470) –

Problemi correlati