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

ответ

1

Чтобы найти «сколько i нужно добавить, чтобы сделать последнюю цифру числа а 0», вы можете вычесть от 10:

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

Второй по модулю используется для специального случая, когда sum % 10 == 0, потому что 10 - 0 = 10

+0

Отлично ... это именно то, что я искал – apomene

0

вы спрашиваете неправильный вопрос. Выражение не является эквивалентом, поэтому x не является значением . Решение состоит в том, что x представляет собой бесконечное число значений, каждое из которых правильно решает уравнение. Таким образом, вы действительно не хотите solve for x, но просто проверьте, находится ли в этом пространстве решение x. Вы можете проверить это просто с:

remainder = base - (sum % base) 

Вы можете проверить, если x суммы до остатка с:

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

base Заменить с 10, и вы будете иметь его.

+0

На самом деле у вас есть точка, но поскольку мы находимся в пространстве [0,10] (контрольная цифра - десятичная цифра), всегда есть только одно решение – apomene

Смежные вопросы