Prima di informarmi, ancora non sapevo che fossero necessariamente lunghi 15 cifre e che l'ultima servisse a verificare la validità delle prime 14.
Ho scritto un algoritmo per controllare la validità di un imei e/o generare la sua cifra di controllo.
Tra il codice trovate anche i come e i perché. Di solito non commento mai i programmi che scrivo, però era meglio fare un'eccezione questa volta ;-)
Ammetto che avevo fatto il ciclo di imeiCheckDigit in Linq, poi mi sono dato dell'idiota e l'ho riscritto come si deve. :D
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication3 { class Program { static void Main(string[] args) { Console.WriteLine(checkImei(Console.ReadLine())); Console.ReadKey(); } static bool checkImei(String imei) { int[] digits = getDigits(imei); //L'imei deve essere di 15 cifre if (digits.Length != 15) return false; return digits[14] == imeiCheckDigit(digits); } /* * si moltiplica * 2 da destra una cifra si una no. i numeri > 9 vengono divisi cifra per cifra * tutte le cifre vengono quindi sommate a formare un unico numero * esempio: 3 + 5*2 + 3 + 9*2 + 5 + 1*2 + 0 + 1*2 + 3 + 9*2 + 7 + 0*2 + 2 + 8*2 = _ * 3+(1+0)+3+(1+8)+5+(2)+0+(2)+3+(1+8)+7+(0)+2+(1+6)=53 * la cifra di controllo viene generata infine cercando il numero per rendere la somma divisibile per 10 * esempio: se la somma è 53, la cifra di controllo è 7 */ static int imeiCheckDigit(int[] n) { int somma = 0; for (int i = n.Length-2; i > 0; i -= 2) { int a = n[i] * 2; if (a > 9) a = a / 10 + a % 10; somma += a + n[i - 1]; } somma %= 10; return somma == 0 ? 0 : (10 - somma); } static int[] getDigits(String s) { return s.Select(digit => int.Parse(digit.ToString())).ToArray(); } } }
Nessun commento:
Posta un commento