program Project1;
uses
SysUtils;
function GetCheckDigit1(num: Integer): Integer;
const
weights: array[0..7] of Integer = (8, 6, 4, 2, 3, 5, 9, 7);
var
s: string;
i, digit, total: Integer;
begin
s := Format('%.8d', [num]);
if Length(s) > 8 then
s := Copy(s, 1, 8);
total := 0;
for i := 1 to 8 do
begin
digit := Ord(s[i]) - Ord('0');
total := total + weights[i-1] * digit;
end;
total := 11 - (total mod 11);
if total = 10 then
total := 0
else if total = 11 then
total := 5;
Result := total;
end;
function GetCheckDigit2(num: Integer): Integer;
const
weights: array[0..7] of Integer = (8, 6, 4, 2, 3, 5, 9, 7);
var
i, sum: Integer;
begin
// Sanity check
if (num > 99999999) or (num < 0) then
Exit(-1);
sum := 0;
for i := 7 to 0 do
begin
sum := sum + weights[i] * (num mod 10);
num := num div 10;
end;
sum := 11 - (sum mod 11);
if sum = 10 then
Result := 0
else if sum = 11 then
Result := 5
else
Result := sum;
end;
procedure test_check_digit(num: Integer; expected: Integer);
var
result1, result2: Integer;
begin
result1 := GetCheckDigit1(num);
Write('Test 1 for num=', num:10, ': ');
if result1 = expected then
WriteLn('Passed')
else
WriteLn('FAILED (got ', result1, ', expected ', expected, ')');
result2 := GetCheckDigit2(num);
Write('Test 2 for num=', num:10, ': ');
if result2 = expected then
WriteLn('Passed')
else
WriteLn('FAILED (got ', result2, ', expected ', expected, ')');
end;
begin
test_check_digit(0, 5);
test_check_digit(1, 4);
test_check_digit(10, 2);
test_check_digit(99999999, 5);
test_check_digit(12345678, 5);
test_check_digit(87654321, 6);
test_check_digit(11111111, 5);
test_check_digit(22222222, 5);
test_check_digit(10000000, 3);
ReadLn;
end.