Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
//algorytm Verhoeff'a
//www.algorytm.org
//(c)2007 by Tomasz Lubinski
program Verhoeff;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
d: array[0..9] of array [0..9] of byte =
((0, 1, 2, 3, 4, 5, 6, 7, 8, 9),
(1, 2, 3, 4, 0, 6, 7, 8, 9, 5),
(2, 3, 4, 0, 1, 7, 8, 9, 5, 6),
(3, 4, 0, 1, 2, 8, 9, 5, 6, 7),
(4, 0, 1, 2, 3, 9, 5, 6, 7, 8),
(5, 9, 8, 7, 6, 0, 4, 3, 2, 1),
(6, 5, 9, 8, 7, 1, 0, 4, 3, 2),
(7, 6, 5, 9, 8, 2, 1, 0, 4, 3),
(8, 7, 6, 5, 9, 3, 2, 1, 0, 4),
(9, 8, 7, 6, 5, 4, 3, 2, 1, 0));
p: array[0..7] of array [0..9] of byte =
((0, 1, 2, 3, 4, 5, 6, 7, 8, 9),
(1, 5, 7, 6, 2, 8, 3, 0, 9, 4),
(5, 8, 0, 3, 7, 9, 6, 1, 4, 2),
(8, 9, 1, 6, 0, 4, 3, 5, 2, 7),
(9, 4, 5, 3, 1, 2, 6, 8, 7, 0),
(4, 2, 8, 6, 5, 7, 3, 9, 0, 1),
(2, 7, 9, 3, 8, 0, 6, 4, 1, 5),
(7, 0, 4, 6, 9, 1, 3, 2, 5, 8));
inv: array[0..9] of byte =
(0, 4, 3, 2, 1, 5, 6, 7, 8, 9);
number: String;
// Check number
// return true if check digit in number is correct, false otherwise
function verhoeffCheck(number: String): boolean;
var
c, digit, i, len: Integer;
begin
c := 0;
len := length(number);
result := false;
for i:=1 to len do
begin
digit := StrToInt(number[len - i + 1]);
c := d[c][p[(i - 1) mod 8][digit]];
end;
if c = 0 then
result := true;
end;
// Calculate check digit for a given number
function verhoeffCheckDigit(number: String): integer;
var
c, digit, i, len: Integer;
begin
c := 0;
len := length(number);
for i:=2 to len do
begin
digit := StrToInt(number[len - i + 1]);
c := d[c][p[(i - 1) mod 8][digit]];
end;
result := inv[c];
end;
// Get number and check it
begin
writeln('Podaj numer do sprawdzenia');
readln(number);
if verhoeffCheck(number) = true then
writeln('Numer jest prawidlowy')
else
begin
writeln('Numer jest nieprawidlowy');
writeln('Dla tego numeru prawidlowa cyfra kontrolna to ' + IntToStr(verhoeffCheckDigit(number)));
end;
readln;
end.