2012-05-15 15 views
5

असल में यह वर्णन करना काफी कठिन है:
मैं एक एल्गोरिदम लागू करना चाहता हूं जो एक ही स्थिति के आंकड़े से आंकड़े की तुलना करता है (जैसा कि मैं 10-आधारित प्रणाली में अपनी गणना करता हूं, यह दो की शक्ति "दस की शक्ति" है) दिए गए पूर्णांक/संख्या (उसी "लंबाई" के साथ)। यह निम्नलिखित के रूप में समानता के ग्रेड लौटना चाहिए:मैं दो पूर्णांक की समानता की गणना कैसे करूं?

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

मैं एक स्ट्रिंग कंप्यूटर अनुप्रयोग के आधार पर मेरी गणना करने के लिए नहीं करना चाहते हैं जहर, क्योंकि मैं इसे बड़े परिदृश्य में कर रहा हूं :)

+2

बस देखा यह अस्पष्ट है ... 4491 और 4091 1 या 3 देता है:

कृपया इस लिंक को देख? – Rawling

+0

@ राउलिंग ने अभी अपना प्रश्न अपडेट किया है! –

+0

मेरे भाग पर उत्कृष्ट, भाग्यशाली अनुमान :) :) – Rawling

उत्तर

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; 
} 

नोट: यह नकारात्मक पूर्णांक से हैंडल नहीं करता

अद्यतन: प्रश्न अपडेट के बाद तय

+0

मुझे यह पसंद है (मेरे समाधान के बाद आग लग गई ...) यदि संख्याएं अलग-अलग हैं तो यह क्या करता है? – Rawling

+2

अच्छा, यह संभाला नहीं जाता है (हालांकि इसे जोड़ना बहुत आसान है)।ओपी ने इस मामले के लिए किसी भी व्यवहार को परिभाषित नहीं किया है, इसलिए मैं सिर्फ एक अपवाद फेंक दूंगा। – max

+0

ठीक है, आपको मेरा +1 मिल गया है। उम्मीद है कि कुछ अन्य भी ध्यान देंगे। – Rawling

0

ऐसा लगता है कि Levenshtein Distance उचित होगा। यह दो तारों के बीच अंतर को मापने का एक मानक तरीका है। आपके मामले में, तार संख्याओं के दशमलव प्रतिनिधित्व हैं।

+0

मुझे लगता है कि लेवेनशेटिन इस समस्या पर लागू नहीं होता है – Jorge

1

See the Answer to this SO Question

आप पहली विधि द्वारा अंक विभाजित करें और दूसरा से समानता प्राप्त कर सकते हैं विधि:

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; 
    } 
} 

अब आप ca n इस तरह दो पूर्णांक सरणियों की तुलना करें:

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

दिलचस्प ... लेकिन प्रदर्शन-डाउन-साइड पर बहुत अधिक सरणी-हैंडलिंग ... –

1

सभी मामलों के लिए जहां एक्स और वाई के बराबर नहीं हैं:

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

4491 और 1020

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

4491 और 4493

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

मुख्य रूप से http://stackoverflow.com/a/10601394/57508 जैसा ही है, लेकिन 'लॉग (1, 10) ':) –

+0

फिर भी' 4489' और '44 9 1 'के साथ विफल रहता है। – Rawling

1

बस salvag करने का प्रयास करने के लिए ई मेरा आखिरी प्रयास के बाद इस सवाल से कुछ ...

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

मैं बात इयूक्लिडियन समानता उपयोग कर रहा है यह गणना करने के लिए सबसे अच्छा तरीका है। http://stackoverflow.com/questions/11555355/calculating-the-distance-between-2-points

+1

हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन यहां उत्तर के आवश्यक हिस्सों को शामिल करना बेहतर है और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक किए गए पृष्ठ में परिवर्तन होने पर लिंक-केवल उत्तर अमान्य हो सकते हैं। - [समीक्षा से] (/ समीक्षा/कम गुणवत्ता वाले पदों/18304470) –

संबंधित मुद्दे