C#SIN号验证器?更快的方法?

时间:2018-01-09 01:31:05

标签: c# algorithm loops

  

我的SIN验证方法:

    static bool validSIN(int sinNumber)
    {
        int total = 0;

        for (int i = 0; i < 9; i++)
        {
            if (i % 2 == 0)
            {
                total += sinNumber % 10;
                sinNumber /= 10;
            }
            else
            {
                total += sinNumber % 10 >= 5 ? (sinNumber % 10) * 2 - 9 : (sinNumber % 10) * 2;
                sinNumber /= 10;
            }
        }
        return total % 10 == 0;
    }
  

我如何使用它:

        int counter = 0;
        for (int i = 100000000; i <= 999999999; i++)
        {
            if (validSIN(i))
            {
                counter++;
                Console.WriteLine("Tried: " + (i - 100000000) +" Found: "+ counter + " SIN: " + i);
            }    
        }
        Console.WriteLine("DONE!");
  

我需要什么:

更有效(更快)的方式来计算有效SIN的总数。

我是新手。任何建议都会有所帮助。

编辑:看看到目前为止我所拥有的。答案可能是可能值的10%。

Program

编辑2:这是公式:

SIN Formula

2 个答案:

答案 0 :(得分:0)

我只能想到一些微观优化,但它不会改进太多。这称为Luhn algorithm。如果有更好的方法,请告诉我。

static readonly int[] Map = { 0, 2, 4, 6, 8, 1, 3, 5, 7, 9 };

static bool ValidSIN(int sinNumber)
{
    var total = 0;
    var isEven = true;

    for (; sinNumber != 0; sinNumber /= 10, isEven = !isEven)
    {
        var digit = sinNumber % 10;
        total += isEven ? digit : Map[digit];
    }

    return total % 10 == 0;
}

答案 1 :(得分:0)

bool IsValidSIN(string SIN)
{
    //normalize
    SIN = SIN.Trim();
    //account for common input formats that use - . or space as separators
    SIN = SIN.Replace(" ", "").Replace("-", "").Replace(".", "");

    //basic validations
    if (string.IsNullOrEmpty(SIN)) return false;
    if (SIN.Length != 9) return false;
    if (!SIN.All(c => char.IsDigit(c))) return false;

    var i = 0;

//:)
    return SIN.Select(x => x - '0').ToList().Aggregate("", (result, n) => result += (n * ((i++ % 2) + 1)).ToString()).Select(x => x - '0').Sum() % 10 == 0;
}