2014-12-04 28 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