2012-05-15 12 views
5

実際には説明するのがかなり難しいです:
同じ位置のFigureを比較するアルゴリズムを実装したいのです(10ベースのシステムで計算したのと同じように、 "10の累乗"と同じです)与えられた整数/数(同じ "長さ")。これは、次のように平等のグレードを返す必要があります:2つの整数の類似度を計算するにはどうすればよいですか?

  • 4491および1020 = 0
  • 4491と4123 = 1
  • 4491および4400 = 2
  • 4491および4493 = 3
  • 4491と私は、文字列-COMPに基づいて私の計算を行うにはしたくない= 4
  • 4491と4091 = 1

4491アリソン、私はより大きなシナリオでこれをやってみましょう:)

+2

ただ、これは曖昧である気づいた... 4491と4091は、1または3を与えるのでしょうか? – Rawling

+0

@Rawlingさんが私の質問を更新しました! –

+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

さて、それは処理されません(追加は非常に簡単ですが)。OPはこの場合の動作を定義していないので、例外をスローします。 – max

+0

さて、あなたは私の+1を持っています。うまくいけば、他の人もメモを取ることを願っています。 – Rawling

0

それはLevenshtein Distanceのように聞こえるでしょう。これは、2つの文字列の違いを測定する標準的な方法です。あなたの場合、文字列は数値の小数表現です。

+0

私はこの問題には適用されませんlevenshteinだと思います – 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; 
    } 
} 

XとYが等しくないすべてのケースについて

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

nは、このように二つのint配列を比較します
4 - Math.Floor(Math.Log10(Math.Abs(4491 - 4493)) + 1) = 3 
+0

は主にhttp://stackoverflow.com/a/10601394/57508と同じですが、 'log( 1、10) ':) –

+0

でも' 4489'と '4491'で失敗します。 – 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) –

関連する問題