2014-12-04 43 views
0

我的目标是实现一个(简单)校验位alglorithm描述Here解决模式编程

我implemantion在下面,但我不知道这是否是最优的:

private int CheckDigit(string SevenDecimal) 
     { 
      ///Get UPC check digit of a 7-digit URI 
      ///Add odd and multiply by 3 =Odds 
      ///Add even =Evens 
      ///Add Odds+Evens=sum 
      ///Check digit is the number that makes Sum divisble by 10 
      int Odds = 0; 
      int Evens = 0; 
      int sum = 0; 
      int index = 0; 
      foreach (char digit in SevenDecimal) 
      { 
       index++; 
       int Digit = int.Parse(digit.ToString()); 

       if (index % 2 == 0) 
       { 
        Evens +=Digit; 
       } 
       else 
       { 
        Odds +=Digit; 
       } 
      } 
      Odds = Odds * 3; 
      sum = Odds + Evens; 


      for (int i = 0; i < 10; i++) ///Brute force way check for better implementation 
      { 
       int Localsum; 
       Localsum = sum + i; 
       if (Localsum % 10 == 0) 
       { 
        return i; 
       } 
      } 
      return -1;//error;     
     } 

我的主关注在最后的循环中,正如我描述的那样完全是蛮横的。 有没有更好的方法来获取校验码?

更准确地说这是编程解决的最好方法,公式:

(sum+x)%10=0 //solve for x 
+1

是不是:10 - (x%10)? – DaniCE 2014-12-04 11:20:24

回答

1

找到“你有多少i增加,使许多0的最后一个数字”,你可以减去从10:

int checkDigit = (10 - (sum % 10)) % 10; 

第二模用于特殊情况sum % 10 == 0,因为10 - 0 = 10

+0

太好了......这正是我所寻找的 – apomene 2014-12-04 11:27:28

0

你问了错误的问题。该表达式不是等价的,因此x不是的值。解决方案是x是无限多的值,每个值都可以正确求解方程。因此,您并不是真的想要solve for x,而只是检查x是否在此解决方案空间中。你可以用简单的检查:

remainder = base - (sum % base) 

然后,您可以测试是否x金额达与余数:

if (x % base === base - (sum % base)) 
{ 
    // (sum + x) % base = 0 is true 
} 

更换base10,你就会有它。

+0

其实你有一个观点,但由于我们在[0,10]空间(校验位是十进制数字),总是只有一个解决方案 – apomene 2014-12-04 11:32:51