我的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%。
编辑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;
}