5

実際、説明するのは非常に難しいです:
与えられた 2 つの整数/数値の同じ位置の数値を比較するアルゴリズムを実装したいと考えています (10 ベースのシステムで計算を行うので、むしろ同じ「10 のべき乗」です)。 (同じ「長さ」で)。次のように等級を返す必要があります。

  • 4491 および 1020 = 0
  • 4491 と 4123 = 1
  • 4491 と 4400 = 2
  • 4491 と 4493 = 3
  • 4491 および 4491 = 4
  • 4491 と 4091 = 1

より大きなシナリオでこれを行うため、文字列比較に基づいて計算を行いたくありません:)

4

6 に答える 6

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

注: 負の整数は処理しません

更新:質問の更新後に修正

于 2012-05-15T13:10:43.877 に答える
1

私の最後の試みの後に、この質問から何かを救い出そうとするだけです...

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;
}
于 2012-05-15T14:11:49.110 に答える
1

X と Y が等しくないすべての場合:

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
于 2012-05-15T13:28:25.387 に答える
1

このSOの質問への回答を参照してください

最初の方法で数字を分割し、2 番目の方法で類似度を取得できます。

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

これで、次のように 2 つの int 配列を比較できます。

int Similarity = GetSimilarity(4491, 4461);// Returns 2
于 2012-05-15T13:13:51.487 に答える
0

レーベンシュタイン距離が適切であるように思えます。これは、2 つの文字列の差を測定する標準的な方法です。あなたの場合、文字列は数値の10進数表現です。

于 2012-05-15T13:09:23.693 に答える